java.util.TimeZone 日光信息是如何更新的?

How is java.util.TimeZone daylight info updated?

我找不到类似的问题,所以在这里。

我需要创建一些警报并基本上确定夏令时何时临近,即 下周四夏令时开始

问题 Timezone 如何知道正确的信息?

我这样问是因为,例如,在我的国家——巴西——这一天是由政府定义的,提前一年。它甚至可能在特定年份不存在。这可能也发生在其他国家。

Java Doc,可以找到以下信息:

This method returns a historically correct offset value if an underlying TimeZone implementation subclass supports historical Daylight Saving Time schedule and GMT offset changes

它说 returns 历史上正确。但是这种检测时区的方法可信度如何?它是否依赖于定期 java 更新,它是否从 Windows 中的某处读取,例如?

提前致谢!

时区更新工具

下面的link解释了使用时区更新工具.

更新Java时区的官方方法

https://www.oracle.com/java/technologies/javase/tzupdater-readme.html

基本上,下载工具 jar 和 运行 命令

java -jar tzupdater.jar options

每个 Java 实现都带有自己的 tzdata, the time zone definition set maintained by Paul Eggert and ICANN 副本。

时区的定义和规则确实经常变化。世界各地的政客都表现出改变其管辖范围内的时区的倾向。你关心这个问题是对的。

Java 实施的更新通常会附带一个新的 tzdata

不幸的是,政客们有时会在很少甚至没有预警的情况下改变他们的时区,而忘记了破坏这种破坏。有时通知只有几个月,甚至几周。例如近年来的俄罗斯、土耳其和摩洛哥。就朝鲜而言,他们的最后一次更改根本没有 预警。

如果您感兴趣的时区在几乎没有警告的情况下被更改,您可能没有时间等待 Java 实施的更新版本。因此,您可能需要自己获取新的 tzdata,并手动更新已安装的 Java 实现。使用 Oracle 的 Timezone Updater Tool 查看

请注意,您还需要更新其他地方的时区日期。其中包括您的主机 OS and some database systems such as Postgres.


您问的是:

Does it depends on regular java updates, does it read from somewhere in Windows, for instance ?

Java 保留自己的时区供 Java 应用程序使用。您的主机 OS 保留自己的时区数据供自己使用和一些本机应用程序使用。 DBMS 等其他一些系统可能会保留自己的时区数据。

你说:

basically identify when a daylight saving time approaches, i.e. next thursday daylight begins

请记住,Daylight Saving Time (DST) 而不是 时区更改其与 UTC 的偏移量的唯一原因。由于各种政治、外交、军事和文化原因,时区会发生变化。

这里是 Java 中的代码,用于确定下一个转换。

切勿使用 java.util.TimeZone as it is part of the troubled legacy date-time classes. Those legacy 类 多年前被 JSR 310 中定义的现代 java.time 类 所取代。

将您感兴趣的时区指定为 ZoneId 对象。

Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 2-4 字母缩写,例如 ESTIST,因为它们 不是 真实时区,未标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Sao_Paulo" ) ;

获取该区域的规则。查询所有已知转换列表的规则。

ZoneRules rules = z.getRules() ;
List<ZoneOffsetTransition> transitions = rules.getTransitions() ;
transitions.stream().forEach( System.out::println ) ;

Transition[Gap at 1914-01-01T00:00-03:06:28 to -03:00]

Transition[Gap at 1931-10-03T11:00-03:00 to -02:00]

Transition[Overlap at 1932-04-01T00:00-02:00 to -03:00]

Transition[Gap at 1932-10-03T00:00-03:00 to -02:00]

Transition[Overlap at 1933-04-01T00:00-02:00 to -03:00]

Transition[Gap at 1949-12-01T00:00-03:00 to -02:00]

Transition[Overlap at 1950-04-16T01:00-02:00 to -03:00]

Transition[Gap at 1950-12-01T00:00-03:00 to -02:00]

Transition[Overlap at 1951-04-01T00:00-02:00 to -03:00]

Transition[Gap at 1951-12-01T00:00-03:00 to -02:00]

Transition[Overlap at 1952-04-01T00:00-02:00 to -03:00]

Transition[Gap at 1952-12-01T00:00-03:00 to -02:00]

Transition[Overlap at 1953-03-01T00:00-02:00 to -03:00]

Transition[Gap at 1963-10-23T00:00-03:00 to -02:00]

Transition[Overlap at 1964-03-01T00:00-02:00 to -03:00]

Transition[Gap at 1965-01-31T00:00-03:00 to -02:00]

Transition[Overlap at 1965-03-31T00:00-02:00 to -03:00]

Transition[Gap at 1965-12-01T00:00-03:00 to -02:00]

Transition[Overlap at 1966-03-01T00:00-02:00 to -03:00]

Transition[Gap at 1966-11-01T00:00-03:00 to -02:00]

Transition[Overlap at 1967-03-01T00:00-02:00 to -03:00]

Transition[Gap at 1967-11-01T00:00-03:00 to -02:00]

Transition[Overlap at 1968-03-01T00:00-02:00 to -03:00]

Transition[Gap at 1985-11-02T00:00-03:00 to -02:00]

Transition[Overlap at 1986-03-15T00:00-02:00 to -03:00]

Transition[Gap at 1986-10-25T00:00-03:00 to -02:00]

Transition[Overlap at 1987-02-14T00:00-02:00 to -03:00]

Transition[Gap at 1987-10-25T00:00-03:00 to -02:00]

Transition[Overlap at 1988-02-07T00:00-02:00 to -03:00]

Transition[Gap at 1988-10-16T00:00-03:00 to -02:00]

Transition[Overlap at 1989-01-29T00:00-02:00 to -03:00]

Transition[Gap at 1989-10-15T00:00-03:00 to -02:00]

Transition[Overlap at 1990-02-11T00:00-02:00 to -03:00]

Transition[Gap at 1990-10-21T00:00-03:00 to -02:00]

Transition[Overlap at 1991-02-17T00:00-02:00 to -03:00]

Transition[Gap at 1991-10-20T00:00-03:00 to -02:00]

Transition[Overlap at 1992-02-09T00:00-02:00 to -03:00]

Transition[Gap at 1992-10-25T00:00-03:00 to -02:00]

Transition[Overlap at 1993-01-31T00:00-02:00 to -03:00]

Transition[Gap at 1993-10-17T00:00-03:00 to -02:00]

Transition[Overlap at 1994-02-20T00:00-02:00 to -03:00]

Transition[Gap at 1994-10-16T00:00-03:00 to -02:00]

Transition[Overlap at 1995-02-19T00:00-02:00 to -03:00]

Transition[Gap at 1995-10-15T00:00-03:00 to -02:00]

Transition[Overlap at 1996-02-11T00:00-02:00 to -03:00]

Transition[Gap at 1996-10-06T00:00-03:00 to -02:00]

Transition[Overlap at 1997-02-16T00:00-02:00 to -03:00]

Transition[Gap at 1997-10-06T00:00-03:00 to -02:00]

Transition[Overlap at 1998-03-01T00:00-02:00 to -03:00]

Transition[Gap at 1998-10-11T00:00-03:00 to -02:00]

Transition[Overlap at 1999-02-21T00:00-02:00 to -03:00]

Transition[Gap at 1999-10-03T00:00-03:00 to -02:00]

Transition[Overlap at 2000-02-27T00:00-02:00 to -03:00]

Transition[Gap at 2000-10-08T00:00-03:00 to -02:00]

Transition[Overlap at 2001-02-18T00:00-02:00 to -03:00]

Transition[Gap at 2001-10-14T00:00-03:00 to -02:00]

Transition[Overlap at 2002-02-17T00:00-02:00 to -03:00]

Transition[Gap at 2002-11-03T00:00-03:00 to -02:00]

Transition[Overlap at 2003-02-16T00:00-02:00 to -03:00]

Transition[Gap at 2003-10-19T00:00-03:00 to -02:00]

Transition[Overlap at 2004-02-15T00:00-02:00 to -03:00]

Transition[Gap at 2004-11-02T00:00-03:00 to -02:00]

Transition[Overlap at 2005-02-20T00:00-02:00 to -03:00]

Transition[Gap at 2005-10-16T00:00-03:00 to -02:00]

Transition[Overlap at 2006-02-19T00:00-02:00 to -03:00]

Transition[Gap at 2006-11-05T00:00-03:00 to -02:00]

Transition[Overlap at 2007-02-25T00:00-02:00 to -03:00]

Transition[Gap at 2007-10-14T00:00-03:00 to -02:00]

Transition[Overlap at 2008-02-17T00:00-02:00 to -03:00]

Transition[Gap at 2008-10-19T00:00-03:00 to -02:00]

Transition[Overlap at 2009-02-15T00:00-02:00 to -03:00]

Transition[Gap at 2009-10-18T00:00-03:00 to -02:00]

Transition[Overlap at 2010-02-21T00:00-02:00 to -03:00]

Transition[Gap at 2010-10-17T00:00-03:00 to -02:00]

Transition[Overlap at 2011-02-20T00:00-02:00 to -03:00]

Transition[Gap at 2011-10-16T00:00-03:00 to -02:00]

Transition[Overlap at 2012-02-26T00:00-02:00 to -03:00]

Transition[Gap at 2012-10-21T00:00-03:00 to -02:00]

Transition[Overlap at 2013-02-17T00:00-02:00 to -03:00]

Transition[Gap at 2013-10-20T00:00-03:00 to -02:00]

Transition[Overlap at 2014-02-16T00:00-02:00 to -03:00]

Transition[Gap at 2014-10-19T00:00-03:00 to -02:00]

Transition[Overlap at 2015-02-22T00:00-02:00 to -03:00]

Transition[Gap at 2015-10-18T00:00-03:00 to -02:00]

Transition[Overlap at 2016-02-21T00:00-02:00 to -03:00]

Transition[Gap at 2016-10-16T00:00-03:00 to -02:00]

Transition[Overlap at 2017-02-19T00:00-02:00 to -03:00]

Transition[Gap at 2017-10-15T00:00-03:00 to -02:00]

Transition[Overlap at 2018-02-18T00:00-02:00 to -03:00]

Transition[Gap at 2018-11-04T00:00-03:00 to -02:00]

Transition[Overlap at 2019-02-17T00:00-02:00 to -03:00]

Transition[Gap at 2019-11-03T00:00-03:00 to -02:00]

Transition[Overlap at 2020-02-16T00:00-02:00 to -03:00]

Transition[Gap at 2020-11-01T00:00-03:00 to -02:00]

Transition[Overlap at 2021-02-21T00:00-02:00 to -03:00]

Transition[Gap at 2021-11-07T00:00-03:00 to -02:00]

Transition[Overlap at 2022-02-20T00:00-02:00 to -03:00]

Transition[Gap at 2022-11-06T00:00-03:00 to -02:00]

Transition[Overlap at 2023-02-26T00:00-02:00 to -03:00]

Transition[Gap at 2023-11-05T00:00-03:00 to -02:00]

Transition[Overlap at 2024-02-18T00:00-02:00 to -03:00]

Transition[Gap at 2024-11-03T00:00-03:00 to -02:00]

Transition[Overlap at 2025-02-16T00:00-02:00 to -03:00]

Transition[Gap at 2025-11-02T00:00-03:00 to -02:00]

Transition[Overlap at 2026-02-22T00:00-02:00 to -03:00]

Transition[Gap at 2026-11-01T00:00-03:00 to -02:00]

Transition[Overlap at 2027-02-21T00:00-02:00 to -03:00]

Transition[Gap at 2027-11-07T00:00-03:00 to -02:00]

Transition[Overlap at 2028-02-20T00:00-02:00 to -03:00]

Transition[Gap at 2028-11-05T00:00-03:00 to -02:00]

Transition[Overlap at 2029-02-18T00:00-02:00 to -03:00]

Transition[Gap at 2029-11-04T00:00-03:00 to -02:00]

Transition[Overlap at 2030-02-17T00:00-02:00 to -03:00]

Transition[Gap at 2030-11-03T00:00-03:00 to -02:00]

Transition[Overlap at 2031-02-16T00:00-02:00 to -03:00]

Transition[Gap at 2031-11-02T00:00-03:00 to -02:00]

Transition[Overlap at 2032-02-15T00:00-02:00 to -03:00]

Transition[Gap at 2032-11-07T00:00-03:00 to -02:00]

Transition[Overlap at 2033-02-20T00:00-02:00 to -03:00]

Transition[Gap at 2033-11-06T00:00-03:00 to -02:00]

Transition[Overlap at 2034-02-26T00:00-02:00 to -03:00]

Transition[Gap at 2034-11-05T00:00-03:00 to -02:00]

Transition[Overlap at 2035-02-18T00:00-02:00 to -03:00]

Transition[Gap at 2035-11-04T00:00-03:00 to -02:00]

Transition[Overlap at 2036-02-17T00:00-02:00 to -03:00]

Transition[Gap at 2036-11-02T00:00-03:00 to -02:00]

Transition[Overlap at 2037-02-22T00:00-02:00 to -03:00]

Transition[Gap at 2037-11-01T00:00-03:00 to -02:00]

Transition[Overlap at 2038-02-21T00:00-02:00 to -03:00]

Transition[Gap at 2038-11-07T00:00-03:00 to -02:00]

Transition[Overlap at 2039-02-20T00:00-02:00 to -03:00]

Transition[Gap at 2039-11-06T00:00-03:00 to -02:00]

让我们将范围缩小到我们的 tzdata 文件中定义的 next expected transition

捕获 UTC 中显示的当前时刻,Instant

Instant instant = Instant.now() ;

然后询问在那一刻之后安排的下一次转换的规则。你得到一个 ZoneOffsetTransition 对象。

ZoneOffsetTransition t = rules.nextTransition( instant );

t.toString(): Transition[Gap at 2020-11-01T00:00-03:00 to -02:00]

计算下一次转换前的剩余时间:

Duration d = Duration.between( instant , t.getInstant() ) ;

PT2695H54M20.431322S

查看此代码 run live at IdeOne.com