如何在Java中将日期和SQL时间组合成单个日期时间?

huangapple go评论98阅读模式
英文:

how can you combine date and sql time into a single date time in java?

问题

使用Java Calendar,您可以如何将开始日期、天数和开始时间组合在一起?

例如:

如果开始日期是9/8/2020,天数是2,开始时间是8:00 AM,那么我们如何获得一个Java日期,即9/9/2020 8:00 AM?以下是我的尝试:

  1. import java.util.Calendar;
  2. import java.util.Date;
  3. public Date startDateTime(Date startDate, int day, java.sql.Time startTime) {
  4. Calendar date = Calendar.getInstance();
  5. date.setTime(startDate);
  6. // 添加天数。由于第1天是第一天,我们需要添加day - 1
  7. date.add(Calendar.DATE, day - 1);
  8. // 设置时间为startTime的时间
  9. Calendar time = Calendar.getInstance();
  10. time.setTimeInMillis(startTime.getTime());
  11. date.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY));
  12. date.set(Calendar.MINUTE, time.get(Calendar.MINUTE));
  13. date.set(Calendar.SECOND, time.get(Calendar.SECOND));
  14. return date.getTime();
  15. }

谢谢您的帮助。

英文:

Using java Calendar how can you combine the start date, day and starttime?

For example:

If the start date is 9/8/2020. The day is 2 and the start time is 8:00 AM then how can we obtain a java date that is 9/9/2020 8:00 AM. Here is my unsuccessful attempt.

  1. def startDateTime(Date startDate, int day, java.sql.Time startTime){
  2. def date
  3. date = Calendar.getInstance()
  4. date.setTime(startDate)
  5. //adding day. since day 1 is the first day we need to add day - 1
  6. date.add(Calendar.DATE, day - 1)
  7. // setting the time from startTime
  8. date.setTimeInMillis(startTime.getTime())
  9. return date.getTime()
  10. }

Thanks for the help.

答案1

得分: 1

你正在调用date.setTime(startDate)date.setTimeInMillis(startTime.getTime())。第二个方法会覆盖第一个方法设置的时间。你应该创建两个单独的Calendar实例。

以下是如何实现这一点:

  1. startDaystartTime创建单独的Calendar实例。
  2. 根据需要从在步骤1中创建的单独的Calendar对象构造一个新的Calendar对象,并添加day

以下是完整的代码:

  1. import java.sql.Time;
  2. import java.time.LocalDateTime;
  3. import java.time.ZoneId;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. public class ProofOfConcept {
  7. public static void main(String[] args) {
  8. int day = 2;
  9. Time startTime = new Time(1, 1, 1);
  10. Calendar timeCalendar = Calendar.getInstance();
  11. timeCalendar.setTime(startTime);
  12. Date startDate = new Date();
  13. Calendar startDateCalendar = Calendar.getInstance();
  14. startDateCalendar.setTime(startDate);
  15. Calendar result = Calendar.getInstance();
  16. result.set(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH), startDateCalendar.get(Calendar.DAY_OF_MONTH) + 2,
  17. timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));
  18. Date date = result.getTime();
  19. System.out.println("date : " + date);
  20. }
  21. }

输出:

date : Tue Sep 08 01:01:01 IST 2020

注意:我建议在java.util.*之上使用java.time.*包。为什么?请查看这里。但这仅适用于Java 8及以上。(尽管在8以下版本中可以使用joda time)


编辑:将Ole V.V.的评论移到答案中。

对于Java 7,我建议通过后移ThreeTen Backport来使用现代Java日期和时间API,即java.time

  1. static LocalDateTime startDateTime(Date startDate, int day, java.sql.Time startTime) {
  2. LocalTime startLocalTime = DateTimeUtils.toLocalTime(startTime);
  3. return DateTimeUtils.toInstant(startDate)
  4. .atZone(ZoneId.systemDefault())
  5. .toLocalDate()
  6. .plusDays(day - 1)
  7. .atTime(startLocalTime);
  8. }
英文:

You are calling date.setTime(startDate) and date.setTimeInMillis(startTime.getTime()). 2nd method is overriding the time set in 1st method. You should create 2 separate instances of Calendar.

Here is how you can achieve this

  1. Create separate Calendar instances for startDay and startTime
  2. Construct a new Calendar object from separate Calendar objects created in #1 & add day as per requirement

Here is the complete code:

  1. import java.sql.Time;
  2. import java.time.LocalDateTime;
  3. import java.time.ZoneId;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. public class ProofOfConcept {
  7. public static void main(String[] args) {
  8. int day = 2;
  9. Time startTime = new Time(1, 1, 1);
  10. Calendar timeCalendar = Calendar.getInstance();
  11. timeCalendar.setTime(startTime);
  12. Date startDate = new Date();
  13. Calendar startDateCalendar = Calendar.getInstance();
  14. startDateCalendar.setTime(startDate);
  15. /* Only java 8 and above
  16. LocalDateTime localDateTime = LocalDateTime.of(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH) + 1, startDateCalendar.get(Calendar.DAY_OF_MONTH),
  17. timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));
  18. localDateTime = localDateTime.plusDays(day);
  19. System.out.println("localDateTime : " + localDateTime);
  20. Date dateFromLocalDateTime = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  21. System.out.println("dateFromLocalDateTime : " + dateFromLocalDateTime);*/
  22. Calendar result = Calendar.getInstance();
  23. result.set(startDateCalendar.get(Calendar.YEAR), startDateCalendar.get(Calendar.MONTH), startDateCalendar.get(Calendar.DAY_OF_MONTH) + 2,
  24. timeCalendar.get(Calendar.HOUR), timeCalendar.get(Calendar.MINUTE), timeCalendar.get(Calendar.SECOND));
  25. Date date = result.getTime();
  26. System.out.println("date : " + date);
  27. }
  28. }

Output:
> date : Tue Sep 08 01:01:01 IST 2020

Note : I suggest using java.time.* packages over java.util.*. Why? Check this. But this is only available in java 8. (Though, you can use joda time in versions below 8).


Edit : Moving Ole V.V. 's comment to answer.

For Java 7, I suggest using java.time, the modern Java date and time API, through the backport, ThreeTen Backport.

  1. static LocalDateTime startDateTime(Date startDate, int day, java.sql.Time startTime) {
  2. LocalTime startLocalTime = DateTimeUtils.toLocalTime(startTime);
  3. return DateTimeUtils.toInstant(startDate)
  4. .atZone(ZoneId.systemDefault())
  5. .toLocalDate()
  6. .plusDays(day - 1)
  7. .atTime(startLocalTime);
  8. }

huangapple
  • 本文由 发表于 2020年9月6日 13:08:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/63760901.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定