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

Java ZoneDateTime到即时转换

慎志国
2023-03-14

我计划根据以下逻辑将ZonedDateTime转换为即时。

比如说,我在太平洋标准时间时区,当前时间是11A。M、 如果我现在转换(截至今天2018年3月4日没有夏令时),toInstant将为7P。M

由于实行夏时制,toInstant将于2018年4月4日上午11点返回。

因此,下面的代码正确返回。

ZonedDateTime dateTime = ZonedDateTime.now();  --->>> March 04th 2018 at 11 A.M PST
dateTime.plusMonths(1).toInstant(); -->> returns April 04th 2018 at 6 PM PST as daylight saving will be observed

但是,

如果我转换为Instant,然后添加一个月,结果会有所不同。

Instant dateTime = ZonedDateTime.now().toInstant();  --->>> March 04th 2018 at 7 P.M UTC
dateTime.plus(1,ChronoUnit.MONTHS).toInstant(); -->> returns April 04th 2018 at 7 PM UTC ( but the actual time should be 6 PM UTC ). 

这是确定的,因为我们已经转换到UTC,它只是从那里添加。

因此,要包括夏令时,我需要添加天或月或年......到ZonedDateTime,然后转换为Instant。

ZonedDateTime dateTime = ZonedDateTime.now();   ---> March 04th 2018 at 11A.M
dateTime.plusDays(10).toInstant();     ---> March 14th 2018 at 6P.M
dateTime.plusMonths(1).toInstant();     ---> April 04th 2018 at 6P.M

上述代码按预期工作。但下面的一个并没有返回6P。M、 但它的回报是7便士。M

dateTime.plusSeconds(org.joda.time.Period.days(1).multipliedBy(10).toStandardSeconds().getSeconds())
         .toInstant())  --> ---> March 14th 2018 at 7P.M

不确定,这有什么问题,以及如何使其在秒数下工作。

共有2个答案

罗寒
2023-03-14

例如,据我所知,您的时间需要增加几分钟或几小时

    long minutesToAdd = Duration.ofDays(10).toMinutes();

我正在使用java。时间,因为我没有与乔达时间的经验。如果你愿意,也许你可以把我的想法翻译成Joda Time。

据我进一步了解,添加上述分钟数的结果不应是几分钟后的时间点。相反,它的工作原理应该与增加10天相同。因此,如果现在是加利福尼亚州的晚上9点,你需要10天后的晚上9点。我建议您在添加分钟或小时之前先转换为本地日期时间,然后再转换回分区日期时间。

    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
    System.out.println(now);
    System.out.println(now.toInstant());
    Instant inTenDays = now.toLocalDateTime()
            .plusMinutes(minutesToAdd)
            .atZone(now.getZone())
            .toInstant();
    System.out.println(inTenDays);

这是刚印出来的

2018-03-04T21:16:19.187690-08:00[America/Los_Angeles]
2018-03-05T05:16:19.187690Z
2018-03-15T04:16:19.187690Z

由于夏令时(DST)于3月15日生效(从今年3月11日开始),因此UTC中的时间并不相同,而是时区中的时间相同。

阎善
2023-03-14

原因可在ZoneDateTime类的文档中找到。对于方法plusDays,我们在方法文档中看到:

这在本地时间线上运行,将天添加到本地日期时间。然后,使用分区ID获取偏移量,将其转换回ZoneDateTime。

转换回ZonedDateTime时,如果本地日期时间处于重叠状态,则尽可能保留偏移量,否则将使用较早的偏移量。如果处于间隙,则本地日期时间将按间隙长度向前调整。

但是,在留档为plus秒方法,我们看到:

这在即时时间线上运行,因此增加一秒将始终是一秒后的持续时间。这可能会导致本地日期时间发生一秒以外的变化。请注意,这与日、月和年使用的方法不同。

因此,这两种方法的行为是不同的,在选择适合您的目的的方法时,您需要考虑这一点。

 类似资料:
  • 从我的数据库我检索值为: 我想要上面的: 我试着用当前的时间戳跟踪 实际时间戳:2018年6月22日星期五16:07:35 更新了,我不想更新,有没有办法保持原样?

  • 说明 支付宝即时到账交易SDK。 官方文档:https://docs.open.alipay.com/62/104743/ 类 SDK类 类名:\Yurun\PaySDK\Alipay\SDK 实例化:$sdk = new \Yurun\PaySDK\Alipay\SDK($params); 公用参数类 类名:\Yurun\PaySDK\Alipay\Params\PublicParams 属性

  • 问题内容: 我遇到了一种情况,我想将儒略日期转换为一个(如果有意义的话)或一些可以更容易理解的Java时间。我对儒略日期的理解来自阅读Wikipedia页面。有很多不同的变体,而我尝试阅读的日期使用的变体不同于所有这些变体。 例如,假设纪元是1750年《日历(新样式)法》的开始,在这种情况下,我认为儒略日期是 CE 2015年4月15日06:37:26.9 UT ,我如何从中获取时间这个?稍后需要

  • 编辑:对不起,也许我的问题不对。。。。 我正在尝试将UTC时间戳转换为Java(Kotlin)中的本地时间戳 f、 exm。 UTC时间18:00德国当地时间是20:00我需要UTC时间戳中的德国当地时间。。。。。 返回UTC时间:( 如何在特定时区将即时UTC转换为Pochmilli

  • 我正在尝试将临时Accessor转换为unix时间戳,但在某些情况下会出错。 下面是重现问题的代码示例: 以下是我得到的错误: 异常线程"main"java.time.DateTimeExc0019:无法从TemporalAccitor:{}获取即时,ISO解析为1970-01-01T00:01类型java.time.format.解析 我只使用此日期格式收到此错误,因此问题可能来自我的DateT

  • 这个问题在互联网上一次又一次地出现(即使是在SO上),但我还没有找到一个令人满意的解决方法: 如何在运行的web应用程序中更改/替换Javascript代码,而不重新加载页面? 很多人对此的回答是“你不能,因为这是不可能的”。IntelliJ IDEAs live edit插件的一些实验证明了这是可能的。但我不想为这个特性绑定到IDE。(加分:与浏览器无关) 下面是我尝试的: 将//#source