我正在使用Java开发日期。我发现两个日期之间的区别。
public static void main(String[] args) {
final Date futDate = new GregorianCalendar(2012, 8, 15, 0, 0, 0).getTime();
final Date currentDate = new GregorianCalendar().getTime();
long diff = Math.round((futDate.getTime() - currentDate.getTime()) / 1000);
System.out.println(diff / 86400 + " days");
System.out.println((diff % 86400) / 3600 + " hrs");
System.out.println(((diff % 86400) % 3600) / 60 + " mins");
System.out.println((((diff % 86400) % 3600) % 60) % 60 + " secs");
}
输出:
31 days
8 hrs
37 mins
30 secs
即使日期差异小于一天,输出也会超过31天。
答案 0 :(得分:8)
答案 1 :(得分:5)
更好的是,使用内置常量:
Calendar.AUGUST
答案 2 :(得分:3)
可以更好地我正在使用Java开发日期。
我发现两个日期之间存在差异。
Joda Time让这很简单:
LocalDateTime start = ...;
LocalDateTime end = ...;
Period period = new Period(start, end, PeriodType.dayTime());
System.out.println(period.getDays() + " days");
System.out.println(period.getHours() + " hrs");
System.out.println(period.getMinutes() + " mins");
System.out.println(period.getSeconds() + " secs");
答案 3 :(得分:0)
答案 4 :(得分:0)
dantuch接受的答案是正确的。 {1}}班级在1月至12月期间有0-11个月的疯狂编号。
麻烦的旧日期时间类如GregorianCalendar
现在已经遗留下来,取而代之的是现代java.time类。
最重要的是,java.time类使用了数月的理智编号,1月到12月的1-12。 Month
枚举使得数月的工作变得更加明确且不易出错。
您在确定日期时忽略了时区问题。您的代码隐式使用JVM的当前默认时区。通过从JVM中任何应用程序的任何线程中的任何代码调用,该默认值可以随时更改。最好明确你期望/预期的时区。
此外,您假设当天从GregorianCalendar
开始。由于夏令时(DST)等异常现象并非总是如此。
00:00:00
...或...
LocalDate ld = LocalDate.of( 2012 , 8 , 15 );
让java.time确定当天的第一时刻。
LocalDate ld = LocalDate.of( 2012 , Month.AUGUST , 15 );
获取当前时刻。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtThen = ld.atStartOfDay( z );
使用ZonedDateTime zdtNow = ZonedDateTime.now( z );
课程获取经过的时间 - 小时 - 分钟 - 秒或Duration
年 - 月 - 天。
Period
没有自动方式来构建您想要的字符串。在Java 9及更高版本中,您可以提取部件以构建自己的字符串:Duration d = Duration.between( zdtThen , zdtNow );
,toDaysPart
,toHoursPart
和toMinutesPart
。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。