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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。