簡體   English   中英

Java Date對象顯示未來時間

[英]Java Date object shows time in the future

我要在當前時間之前的某個時間創建一個新的日期對象。 如果我要在今天前1天放映,效果很好。 但如果我想在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文字在之前被求值,結果為負,然后被賦給long

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

這導致-1702967296

轉換成

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

注意: L使它成為long字面量,然后相乘

最好使用Calendar類進行Date操作


另請參閱

tl; dr

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及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM