gpt4 book ai didi

本地应用程序和 Jenkins 部署之间的 Java 日期时间不一致

转载 作者:行者123 更新时间:2023-11-30 01:44:02 28 4
gpt4 key购买 nike

我正在将日期时间作为字符串接收到我的应用程序中。在那里我需要提取小时,以便可以将其与其他一些内容一起写入文件。对于我的单元测试,字符串将如下所示

2019-10-26T00:00:00+01:00

我用来提取小时的代码是这样的

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public static int extractHour(String dateInString) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ");
DateTime dateTime = formatter.parseDateTime(dateInString);
return dateTime.getHourOfDay();
}

我的测试在本地通过,预期时间为 00 小时,实际时间为 00,但是当我通过 Jenkins 部署时,实际时间显示为 23,而我的预期时间为 00。

最佳答案

当您不以其他方式指示 Joda-Time 时,formatter.parseDateTime() 会解析为默认时区的 DateTime

例如,如果您的本地时区设置为欧洲/都柏林或欧洲/伦敦,则解析结果将是 DateTime2019-10-26T00:00:00.000 +01:00(因为 10 月 26 日是这些时区夏令时 (DST) 的最后一天),并且如您所料,一天中的小时将为 0。如果 Jenkins 服务器的时区设置是 UTC(这很常见),您的字符串就会被解析为 2019-10-25T23:00:00.000Z 。显然,一天中的时间是 23 点。

如果您希望在 DateTime 中保留字符串的偏移量,修复方法是:

    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
.withOffsetParsed();

但是,请三思而后行。一天中的小时仅相对于偏移量才有意义。在夏令时结束的晚上,您可能会收到 2019-10-27T01:00:00+01:00 字符串,一小时后,当时钟更改时,2019-10-27T01 :00:00+00:00。两个字符串的小时数均为 1,但它们之间有一个小时。你真的想要同样的结果吗?如果有一天您收到一串 2020-02-16T00:00:00-05:00 会怎样?

编辑:

What would you suggest rather than using withOffsetParsed()[?]

我首先建议您决定对于具有不同偏移量的字符串想要什么结果,例如 2020-03-06T18:00:00+05:302020-04 -18T04:00:00-08:00。你应该比我更清楚这一点。

处理跨偏移量时间的一般建议做法是处理 UTC 中的所有内容。这可能是您已经找到并在评论中提到的解决方案的特例,在格式化程序上指定时区:

    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
.withZoneUTC();

这保证了一致的结果,显然与您在 Jenkins 服务器上获得的结果相同。所以在你的例子中是 23。

PS 如果这是新代码,您可能不应该使用 Joda-Time。 The Joda-Time homepage说:

Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).

关于本地应用程序和 Jenkins 部署之间的 Java 日期时间不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860689/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com