gpt4 book ai didi

java - Joda Time 给出了错误的时区

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:30 24 4
gpt4 key购买 nike

我正在使用 Joda time (1.6) 库,它不断返回时区错误的 DateTime 对象,英国夏令时而不是格林威治标准时间。

我的 Windows 工作站(运行 JDK 1.6.0_16)认为它是 GMT,如果我从 JDK 日期/时间类获得默认时区,它是正确的(GMT)。我在我们的 Linux 服务器上也有同样的行为。我认为这可能是 Joda 中时区数据库文件的错误,所以我用最新的数据库重建了 jar,但没有任何改变。

import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

public class TimeZoneTest {

public static void main(String[] args) {
DateTimeFormatter timeParser = ISODateTimeFormat.timeParser();
TimeZone timeZone = TimeZone.getDefault();
System.out.println(timeZone.getID()); // "Europe/London"
System.out.println(timeZone.getDisplayName()); // "Greenwich Mean Time"

DateTimeZone defaultTimeZone = DateTimeZone.getDefault();
System.out.println(defaultTimeZone.getID()); //"Europe/London"
System.out.println(defaultTimeZone.getName(0L)); //"British Summer Time"

DateTime currentTime = new DateTime();
DateTimeZone currentZone = currentTime.getZone();
System.out.println(currentZone.getID()); //"Europe/London"
System.out.println(currentZone.getName(0L)); //"British Summer Time"
}
}

通过 org.joda.time.DateTimeZone 中的静态初始化程序进行调试,我看到 System.getProperty("user.timezone") 调用给出了 "欧洲/伦敦” 符合预期。

最佳答案

好吧,要找到这个问题的根源,您必须熟悉英国夏令时的实际含义及其实现时间。简而言之,您将 0L 传递给 getName(),即 1970-01-01T00:00:00Z 所以 DefaultTimeZone 查找当时的时区名称。这是英国夏令时。

From: http://www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time

In 1968 clocks were advanced one hour ahead of GMT on 18 February and remained so until British Standard Time, during which clocks were kept in advance of GMT all year, came into force between 27 October 1968 and 31 October 1971.

如果您改为传入自 1970-01-01T00:00:00Z 以来的正确毫秒数。例如通过做

defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis())

你也会得到正确的字符串。基本上,您只是向 getName() 方法提供了错误的参数,因此导致了意想不到的结果。

如果您想详细查看,请查看 joda 源代码的 org/joda/time/tz/src 中的文件,以了解 joda 是如何确定时区的。


代替

defaultTimeZone.getName(0L)

你可以用

defaultTimeZone.toTimeZone().getDisplayName()

这是为我做的。

关于java - Joda Time 给出了错误的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1714300/

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