Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日期对象显示未来的时间_Java_Date_Datetime - Fatal编程技术网

Java日期对象显示未来的时间

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

在当前时间之前的某个时间,我正在创建一个新的日期对象。如果我在今天的前一天让它显示出来,它工作得很好。但是,如果我想在30天前展示,它将走向未来(?)

输出:

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,然后相乘

最好使用
日历
类进行
日期
操作


另请参见

tl;博士 java.time 现代java.time类提供了这些函数

如果我要在今天前一天展示

我想在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 该框架内置于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 ) ;