当前位置: 首页 > 知识库问答 >
问题:

在Java中基于开始日期和期间生成新日期

仲孙默
2023-03-14

所以我有:

< code >日期开始日期,即< code > EEST 2022年3月27日17时32分01秒

字符串周期,即PT240H

我需要根据这两个值生成一个新日期。我需要将240H周期添加到开始日期。240H意味着我需要添加到开始日期的10天,我最终需要一个新的日期,应该是EEST 2022年4月6日星期三17:32.01。

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

共有1个答案

仲孙宇定
2023-03-14
java.util.Date.from( 
    myJavaUtilDate
    .toInstant()
    .plus( Duration.parse( "PT240H" ) ) 
)

把那些发表的评论放在一起…

您正在使用糟糕的日期-时间类,这些类几年前就被JSR 310中定义的现代java.time类所取代。避免使用< code>Date、< code>Calendar等。

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

Instant instant = myJavaUtilDate.toInstant() ;

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

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

添加到我们的即时以生成每个不可变对象的另一个即时

Instant later = instant.plus( d ) ;

你说:

240H 表示 10 天

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

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

如果您必须与尚未更新为java的旧代码进行互操作。时间,您可以转换回日期。但我强烈建议尽快远离这些遗留类。

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

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

实时时区以大陆/地区的格式命名,例如非洲/卡萨布兰卡亚洲/东京

伪时区< code>EEST意味着许多不同的时区。在这个示例代码中,我使用了实时时区“欧洲/布加勒斯特”。根据你的用户资料,我想那是你的区域。

首先,我们需要重新创建< code>Date#toString报告的“EEST 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]
 类似资料:
  • 问题内容: 我想检查日期是否在开始日期和结束日期之间。 我添加了一个where子句 但问题在于它不包含“ 2010-04-15”。 它应该包括结束日期,我该怎么办? 请帮我 问候, 潘卡 问题答案: 明确指定时间部分:

  • 问题内容: 我需要生成两个给定日期之间的所有日期。只要只有一个日期范围,此方法就可以正常工作。但是,如果我有多个日期范围,则此解决方案不起作用。我在这里以及Asktom上都进行了搜索,但是找不到相关的指针/解决方案。 我使用all_objects和CONNECT BY ROWNUM尝试了两种解决方案,但是没有运气。这是问题说明:sqlfiddle 输入 输出 问题答案:

  • 问题内容: 我需要填充一个表,该表将存储2个给定日期之间的日期范围:09/01/11-10/10/11 因此,在这种情况下,该表将从2011年9月1日开始存储,直到每天存储到10/10/11,我想知道在SQL Server中是否有一种巧妙的方法-我目前正在使用SQL Server 2008 。 谢谢 问题答案: 在SQL 2005+上很容易;如果您有数字表或理货表,操作会更容易。我在下面伪造了它:

  • 问题内容: 如果可能的话,在以下情况下,我希望使用joda或非joda解决方案 假设我的一周从2012年5月2日开始,给定的当前日期为02/22/2011。我需要计算给定当前日期的星期开始和结束日期。因此,我的解决方案的星期应该从02/19开始,而星期在02/25结束。为简单起见,我将我的工作日设置为02/05/2011,但是可能是任何一天,我的工作日始终为7天。 我现有的代码如下,但似乎无法按预

  • 我想在日期时间选择器中选择大于开始日期的结束日期时间。 当前,我正在开始日期时间和结束日期时间。 假设,我选择了时间为12:00 pm的当前日期,现在end date应该是时间为1:00 pm的当前日期。 我想要下面这样的东西 示例 开始日期和时间:---2019-11-06 12:00结束日期和时间:---2019-11-06 1:00 这是我的代码 null null

  • 问题内容: 我一直在尝试从时间戳字段中的第一个日期到最后一个日期生成一系列日期(YYYY-MM-DD HH)。我已经有了所需的内容,但是在尝试从表中获取开始日期和结束日期时遇到了一个问题。我有以下一个大概的想法: Postgres 9.3 问题答案: 您不需要CTE,这将比必要的成本更高。 而且您不需要强制转换为,当您向类型提供数据时,结果已经 是 数据类型。详细信息在这里: 在PostgreSQ