【问题标题】:Java: How can I manipulate date to add days or months without using Calendar?Java:如何在不使用日历的情况下操作日期以添加天数或月数?
【发布时间】:2021-02-26 15:04:02
【问题描述】:

我有一个比较两个日期的简单函数,如果两个日期相等 - 我想将其中一个日期添加 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");
    
}

在我的比较中,我想进行更新。谁能告诉我怎么做?

【问题讨论】:

标签: java date simpledateformat


【解决方案1】:

永远不要使用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 类表示您的月或周的时间跨度。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多