Java日期对象显示未来的时间
在当前时间之前的某个时间,我正在创建一个新的日期对象。如果我在今天的前一天让它显示出来,它工作得很好。但是,如果我想在30天前展示,它将走向未来(?) 输出:Java日期对象显示未来的时间,java,date,datetime,Java,Date,Datetime,在当前时间之前的某个时间,我正在创建一个新的日期对象。如果我在今天的前一天让它显示出来,它工作得很好。但是,如果我想在30天前展示,它将走向未来(?) 输出: 1408160853776 Thu Aug 14 20:47:33 PDT 2014 Thu Sep 04 13:50:21 PDT 2014 这里有什么限制?达到长限制?文本中的整数溢出 在您的情况下,intliterals在前面被求值,结果是否定的,然后被分配到long sometime = 30* 24 * 60 * 60 * 1
1408160853776
Thu Aug 14 20:47:33 PDT 2014
Thu Sep 04 13:50:21 PDT 2014
这里有什么限制?达到长限制?文本中的整数溢出 在您的情况下,
int
literals在前面被求值,结果是否定的,然后被分配到long
sometime = 30* 24 * 60 * 60 * 1000; //a month
这将导致-1702967296
将其转换为
sometime = 30* 24 * 60 * 60 * 1000L; //a month
注意:L
使其成为long
literal,然后相乘
最好使用日历
类进行日期
操作
另请参见
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 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。您应该看看
Calendar
类,它为您进行了大量的计算。或者更好的是,新的API(如果您使用的是Java 8)。如果不能,请使用JodaTime。一天并不总是24小时。月份并不总是30天。而最初的日期/时间/日历类(以及相关的格式化程序/解析器)有很多问题。只需补充说明:阅读关于闰秒的内容,24*60*60*1000并不总是一天,请使用calendarFYI,像和java.text.SimpleDateFormat
这样麻烦的旧日期时间类现在被这些类取代。请参阅。30
不应该是30L
以强制所有计算都是长的吗?@code如果其中任何一个是long
表达式将在long
@JigarJoshi中计算是的,最终值是long
,但是有几个中间计算会导致int
,并留下溢出的可能性。通过将第一个文本更改为long
,所有中间结果也将long
,从而避免所有潜在的溢出错误。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
LocalDate yesterday = today.minusDays( 1 ) ;
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 ) ;