Java Date对象显示将来的时间

时间:2014-08-16 03:51:07

标签: java date datetime

我在当前时间之前的某个时间制作了一个新的约会对象。如果我在今天前一天显示它,它可以正常工作。但是,如果我想在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

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

2 个答案:

答案 0 :(得分:5)

int文字中的整数溢出,

在您的情况下,int文字会在之前得到评估,结果会产生否定结果而不会被分配到long

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

这导致-1702967296

将其转换为

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

注意:L使其成为long字面值,然后乘以

最好使用Calendar类进行Date操作


另见

答案 1 :(得分:0)

TL;博士

LocalDate.now()
         .minusDays( 1 ) 

java.time

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

  

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

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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