当我想在java中总结两个日期时,它不起作用:
System.out.println(date + " <---- date");
System.out.println(time + " <---- time");
System.out.println(new Date(date.getTime() + time.getTime()) + " <---- new Date(time.getTime() + date.getTime())");
导致以下输出:
Wed Nov 06 00:00:00 CET 2013 <---- date
Thu Jan 01 11:51:14 CET 1970 <---- time
Wed Nov 06 10:51:14 CET 2013 <---- new Date(time.getTime() + date.getTime())
...但如果我使用Calender
就可以了!
Calendar calendar = Calendar.getInstance();
calendar.setTime(time);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, min);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date myDate = calendar.getTime();
System.out.println(myDate);
结果
Wed Nov 06 11:51:00 CET 2013
这是正确的
有人能解释我为什么吗?
答案 0 :(得分:2)
从根本上说,你在这里遇到时区问题。您使用java.util.Date
来表示一天中的时间这一事实让您陷入困境。你的11:51:14 CET的时间实际上是10:51:14 UTC,所以当你添加调用time.getTime()
的结果时,你只是添加“不到11小时”而不是“不到12小时” ”。使用不适当的数据类型使得所有这些都难以使用和理解。
我强烈建议使用Joda Time来完成所有这些操作。然后,您可以从LocalDate
和LocalTime
开始,将它们合并到LocalDateTime
中,然后在需要应用特定时区时进行计算。
使用正确的数据类型,这正是您要传达的内容,为日期/时间工作带来巨大的差异。