Java:在不使用日历的情况下,如何操纵日期来添加天或月?

Java:在不使用日历的情况下,如何操纵日期来添加天或月?,java,date,simpledateformat,Java,Date,Simpledateformat,我有一个比较两个日期的简单函数,如果两个日期相等,我想在其中一个日期上加7天,或者根据场景加一个月。我有两个使用simpleDateFormat格式化的日期,它们从字符串转换为日期,然后像这样比较它们 Date dateExpired = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(expDate); Date dateEffective = new SimpleDateFormat("yyyy-MM

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

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

永远不要使用
日历
,这是可怕的日期时间类的一部分,多年前被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 ) ;

阅读以下内容:您是否绑定到
日期
对象?因为
LocalDate
对象提供了一种更流畅的操作方法,所以使用