Java Date对象显示将来的时间

我在当前时间之前的某个时间制作了一个新的约会对象。 如果我在今天前一天显示它,它可以正常工作。 但是如果我想在30天前展示它,它会发展到未来(?)

Date date = new Date(); long sometime = 24 * 60 * 60 * 1000; //a day System.out.println(date.getTime() ); Date sometimeago = new Date(date.getTime() - sometime); System.out.println(sometimeago ); sometime = 30* 24 * 60 * 60 * 1000; //a month sometimeago = new Date(date.getTime() - sometime); System.out.println(sometimeago ); 

输出:

 1408160853776 Thu Aug 14 20:47:33 PDT 2014 Thu Sep 04 13:50:21 PDT 2014 

这有什么限制? 达到长期限制?

int文字中的整数溢出,

在你的情况下, int literals在之前得到评估,结果为负结果,而不是分配给long

 sometime = 30* 24 * 60 * 60 * 1000; //a month 

结果为-1702967296

将其转换为

 sometime = 30* 24 * 60 * 60 * 1000L; //a month 

注意: L使其long文字然后乘以

最好使用Calendar类进行Date操作


另见

  • 如何从Java中的Date对象中减去X天?

TL;博士

 LocalDate.now() .minusDays( 1 ) 

java.time

现代java.time类提供了这些function。

如果我在今天前一天显示它,

 ZoneId z = ZoneId.of( "America/Montreal" ) ; LocalDate today = LocalDate.now( z ) ; LocalDate yesterday = today.minusDays( 1 ) ; 

我想在30天前展示

 LocalDate thirtyDaysAgo = today.minusDays( 30 ) ; 

或许你想要一个合乎逻辑的月而不是三十天。

 LocalDate monthAgo = today.minusMonths( 1 ) ; 

也许你想要一个日期时间而不是一个仅限日期的值。

 ZonedDateTime now = ZonedDateTime.now( z ) ; ZonedDateTime zdtYesterday = now.minusDays( 1 ) ; ZonedDateTime zdtThirtyDaysAgo = now.minusDays( 30 ) ; ZonedDateTime zdtMonthAgo = now.minusMonths( 1 ) ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。