簡體   English   中英

Java:如何在不使用日歷的情況下操作日期以添加天數或月數?

[英]Java: How can I manipulate date to add days or months without using Calendar?

我有一個簡單的 function 比較兩個日期,如果兩個日期相等 - 我想將其中一個日期添加 7 天,或者根據情況添加一個月。 我有兩個使用 simpleDateFormat 格式化的日期,它們從字符串轉換為日期,然后我像這樣比較它們

Date dateExpired = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(expDate);
Date dateEffective = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(effDate);

比較方法:

if(dateExpired.before(dateEffective) || dateExpired.equals(dateEffective)) {
    System.out.println("Same date for effective and expired");
    
}

在我的比較中,我想進行更新。 誰能告訴我該怎么做?

永遠不要使用Calendar ,這是幾年前被 JSR 310 中定義的現代java.time類所取代的糟糕日期時間類的一部分。

切勿在日期時間格式模式中的Z周圍加上單引號。 該字母表示與 UTC 的偏移量為零時分秒。 您的報價正在丟棄有價值的信息。

您的輸入字符串顯然采用標准 ISO 8601 格式。 java.time類在解析/生成文本時默認使用標准格式。 所以不需要指定格式模式。

將您的輸入解析為Instant對象以表示在 UTC 中看到的時刻。

Instant expirationUtc = Instant.parse( x ) ;
Instant effectiveUtc = Instant.parse( y ) ;

對於任何給定的時刻,日期在全球范圍內因時區而異。 在日本東京可能是“明天”,而在美國俄亥俄州托萊多可能是“昨天”。

因此,您必須將輸入調整為您想要感知日期的時區。

ZoneId z = ZoneId.of( "America/Edmonton" ) ; 
ZonedDateTime expiration = expirationUtc.atZone( z ) ;
ZonedDateTime effective = effectiveUtc.atZone( z ) ;

測試日期是否相等。 提取日期部分進行比較。

if( expiration.toLocalDate().isEqual( effective.toLocalDate() ) ) {…}

使用Period class 表示您的月或周的時間跨度。

Period period = Period.ofWeeks( 1 ) ;
ZonedDateTime later = expiration.plus( period ) ;

暫無
暫無

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

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