根据Java中的开始日期和期间生成新日期



所以我有:

Date startDateSun Mar 27 17:32:01 EEST 2022

String periodPT240H

我需要根据这两个值生成一个新的日期。我需要将240H周期添加到startDate中。240H意味着我需要添加到startDate的10天,我最终需要一个新的日期,应该是Wed Apr 6 17:32.01 EEST 2022

PS。我是Java的新手,希望我不会问愚蠢的事情。

tl;dr

java.util.Date.from( 
myJavaUtilDate
.toInstant()
.plus( Duration.parse( "PT240H" ) ) 
)

详细信息

把那些张贴的评论放在一起…

您使用的是糟糕的日期-时间类,这些类在几年前被JSR310中定义的现代java.time类所取代。避免使用DateCalendar等。

如果交给java.util.Date对象,请立即转换为其替换类java.time.Instant。使用添加到旧类中的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;

将标准ISO 8601格式的输入字符串解析为Duration对象。

Duration d = Duration.parse( "PT240H" ) ;

添加到我们的Instant中,以生成第二个Instant,每个不可变对象。

Instant later = instant.plus( d ) ;

你说:

240H表示10天

不正确,240小时是,而不一定是10天。如果您调整到一个时区,添加240小时的值可能会也可能不会导致十天后的某个时刻。某些时区的某些日期的长度各不相同,分别为23、23.5、25或其他小时数。

请注意,java.util.DateInstant都表示UTC中的一个时刻,即偏移量为零小时分秒。不幸的是,Date#toString方法在生成文本时动态地应用JVM的当前默认时区,这会产生一种错误的错觉。这种令人困惑的行为是遗留日期-时间类中的许多设计流之一。

如果必须与尚未更新到java.time的旧代码进行互操作,则可以转换回Date。但我强烈建议尽快放弃这些遗留类。

java.util.Date date = Date.from( someInstant ) ; 

示例代码

仅供参考,EEST而不是时区。这样的2-4个字母的伪区域指示夏令时(DST(是否有效,并提示可能的时区。这些只能用于向用户展示,而不能用于业务逻辑、数据存储或数据交换。

实时区域以Continent/Region的格式命名,例如Africa/CasablancaAsia/Tokyo

伪区域CCD_ 21意味着许多不同的时区。在这个示例代码中;欧洲/布加勒斯特";。考虑到你的用户档案,我猜这就是你的区域。

首先,我们需要将Date#toString报道的您的时刻重新创建为"2022年3月27日下午17:32:01"。

// Recreate original conditions.
LocalDate ld = LocalDate.of( 2022 , Month.MARCH , 27 );  // Sun Mar 27 17:32:01 EEST 2022
LocalTime lt = LocalTime.of( 17 , 32 , 1 );
ZoneId z = ZoneId.of( "Europe/Bucharest" );
TimeZone.setDefault( TimeZone.getTimeZone( z ) );
ZonedDateTime zdtStarting = ZonedDateTime.of( ld , lt , z );
Instant then = zdtStarting.toInstant();
java.util.Date startingPoint = Date.from( then );

从传统类转换为现代类。

Instant instant = startingPoint.toInstant();

添加您想要的240小时。调整到一个时区中可以获得一个ZonedDateTime,这样我们就可以更好地看到它的真实含义。

Duration duration = Duration.parse( "PT240H" );
Instant later = instant.plus( duration );
Date endingPoint = Date.from( later );
ZonedDateTime zdtLater = later.atZone( z );

转储到控制台。

System.out.println( "-------|  Start  |--------------------" );
System.out.println( "zdtStarting = " + zdtStarting );
System.out.println( "startingPoint = " + startingPoint );
System.out.println( "instant = " + instant );
System.out.println( "-------|  End  |--------------------" );
System.out.println( "later = " + later );
System.out.println( "endingPoint = " + endingPoint );
System.out.println( "zdtLater = " + zdtLater );

运行时。

-------|  Start  |--------------------
zdtStarting = 2022-03-27T17:32:01+03:00[Europe/Bucharest]
startingPoint = Sun Mar 27 17:32:01 EEST 2022
instant = 2022-03-27T14:32:01Z
-------|  End  |--------------------
later = 2022-04-06T14:32:01Z
endingPoint = Wed Apr 06 17:32:01 EEST 2022
zdtLater = 2022-04-06T17:32:01+03:00[Europe/Bucharest]

相关内容

  • 没有找到相关文章

最新更新