时区的历史上存在一些特定时区被重命名的案例。例如,Asia/Calcutta时区已被视为已过时并被替换Asia/Kolkata。
在乌克兰,根据国际标准,有一个时区称为Europe/Kiev。乌克兰首都的正式名称为“基辅”。“基辅”是一个错误的版本,早在 1991 年苏联解体之前就已出现。
我们有一个非常大的程序员社区,他们希望开始将Europe/Kiev时区重命名为Europe/Kyiv. 我们知道每个人都需要很长时间才能过渡,但必须从长远来看。
我们如何以及在何处提出此建议,以便正式统治时区名称的人员可以对其进行审查?
我在使用 . 测试一些时区时发现了一个奇怪的 java 差异ZonedDateTime。我试图解析 1970 年之前的日期,发现结果在 java 版本之间发生变化。1932 年荷兰的偏移量是+00:19。有谁知道为什么会发生这种情况?我觉得这可能与时区数据库项目( https://github.com/eggert/tz )中欧洲时区的捆绑有关,但我不确定。有没有办法获得java中的旧行为?就像设置一样?
ZonedDateTime zdt = LocalDateTime.parse("1932-10-20T10:19:32.000").atZone(ZoneId.of("Europe/Amsterdam"));
System.out.println(zdt);
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(ISO_LOCAL_DATE)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR, 2)
.optionalStart()
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE, 2)
.optionalStart()
.appendFraction(NANO_OF_SECOND, 3, 3, true)
.appendOffset("+HH:MM", "Z")
.toFormatter();
System.out.println(formatter.format(zdt));
System.out.println(
java.time.zone.ZoneRulesProvider
.getVersions("UTC")
.lastEntry()
.getKey()
);
Run Code Online (Sandbox Code Playgroud)
结果 Temurin (java jdk) 11.0.16 (预期输出),最后一行显示时区数据库版本:
1932-10-20T10:19:32+00:19:32[Europe/Amsterdam]
1932-10-20T10:19:32.000+00:19
2022a
Run Code Online (Sandbox Code Playgroud)
Temurin 11.0.17 的结果:
1932-10-20T10:19:32Z[Europe/Amsterdam]
1932-10-20T10:19:32.000Z
2022c
Run Code Online (Sandbox Code Playgroud)
编辑:从 17.0.5 开始,JDK 17 中也存在一个问题:
铁木林 17.0.4:
1932-10-20T10:19:32+00:19:32[Europe/Amsterdam]
1932-10-20T10:19:32.000+00:19
2022a
Run Code Online (Sandbox Code Playgroud)
铁木林 …
我需要在Centos 7.4 64位上使用php(5.4)将日期时间信息从本地时间(gtm + 1)转换为UTC
我尝试了以下程序:
function convertToUtc ($date)
{
$dateTime = new DateTime ($date, new DateTimeZone('Europe/Rome'));
$dateTime->setTimezone(new DateTimeZone('UTC'));
return $dateTime->format('Y-m-d') . 'T' . $dateTime->format('H:i:s') . 'Z';
}
Run Code Online (Sandbox Code Playgroud)
这工作到2038年之后,它错误地计算DST总是返回1小时的偏移量:
2037:一切都好
LOCAL TIME -> UTC TIME
2037-03-28 10:12:13 -> 2037-03-28T09:12:13Z the day before dst change
2037-03-29 10:12:13 -> 2037-03-29T08:12:13Z the first DST day
2037-10-24 10:12:13 -> 2037-10-24T08:12:13Z the last DST day
2037-10-25 10:12:13 -> 2037-10-25T09:12:13Z the day after
2038 : ok until dst change
2038-03-27 10:12:13 -> 2038-03-27T09:12:13Z OK
2038-03-28 10:12:13 …Run Code Online (Sandbox Code Playgroud) 我有这段代码:
case Timex.Timezone.get(data) do
{:error, _} = error ->
error
data ->
{:ok, data}
end
Run Code Online (Sandbox Code Playgroud)
将保存在数据库中的时区放入结构中。
好吧,当运行通过 Ecto 查询获取一些数据的迁移时,我收到此错误:
** (ArgumentError) argument error
(stdlib) :ets.lookup(:tzdata_current_release, :release_version)
lib/tzdata/release_reader.ex:47: Tzdata.ReleaseReader.current_release_from_table/0
lib/tzdata/release_reader.ex:14: Tzdata.ReleaseReader.simple_lookup/1
lib/tzdata/release_reader.ex:7: Tzdata.ReleaseReader.zone_and_link_list/0
lib/tzdata.ex:40: Tzdata.zone_exists?/1
lib/timezone/timezone.ex:152: Timex.Timezone.name_of/1
lib/timezone/timezone.ex:180: Timex.Timezone.get/2
lib/common/ecto/timezone.ex:27: Common.Ecto.Timezone.load/1
(ecto) lib/ecto/type.ex:661: Ecto.Type.process_loaders/3
(ecto) lib/ecto/schema.ex:1490: Ecto.Schema.load!/5
(ecto) lib/ecto/schema.ex:1442: Ecto.Schema.safe_load_zip/4
(ecto) lib/ecto/schema.ex:1443: Ecto.Schema.safe_load_zip/4
(ecto) lib/ecto/schema.ex:1430: Ecto.Schema.__safe_load__/6
(ecto) lib/ecto/repo/queryable.ex:282: Ecto.Repo.Queryable.process_source/6
(ecto) lib/ecto/repo/queryable.ex:170: Ecto.Repo.Queryable.preprocess/5
(postgrex) lib/postgrex/query.ex:77: DBConnection.Query.Postgrex.Query.decode_map/3
(postgrex) lib/postgrex/query.ex:64: DBConnection.Query.Postgrex.Query.decode/3
(db_connection) lib/db_connection.ex:1019: DBConnection.decode/6
(ecto) lib/ecto/adapters/postgres/connection.ex:73: Ecto.Adapters.Postgres.Connection.prepare_execute/5
(ecto) lib/ecto/adapters/sql.ex:256: Ecto.Adapters.SQL.sql_call/6
Run Code Online (Sandbox Code Playgroud)
在堆栈跟踪中包含该代码并执行一些检查可以验证这确实是触发错误的调用,尽管这样做:
iex(1)> Timex.Timezone.get("America/Los_Angeles")
#<TimezoneInfo(America/Los_Angeles …Run Code Online (Sandbox Code Playgroud) 我只是偶然发现了用于 alpine 的 tzdata2020c 包的一个错误。在 2020 年 10 月 25 日下星期日的夏令时计划更改后,它不会计算欧洲/柏林的正确时间。 tzdata2020c 版本使用 CEST,例如 2020 年 10 月 31 日和欧洲/柏林时区,而 CET 是正确的。
有谁知道如何手动添加新版本的 tzdata2020d 数据库,该数据库可在此处获得。
我用 Go 编写的应用程序在 2020 年 10 月 31 日使用 tzdata2020c 错误地将 CEST 用于欧洲/柏林:

同一应用程序在 2020 年 10 月 31 日使用 tzdata2020a 正确使用了欧洲/柏林的 CET:

我在具有以下基本映像的容器中运行我的应用程序:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
当我发布应用程序时,容器时区是Greenwich Mean Time,因此我在数据库中的 NLog 条目关闭了 6 小时。
我可以通过进入容器并运行来更改时区,
dpkg-configure tzdata并且在重新启动容器后,我的日志条目变得正常。但是,我想知道这是否可以通过 Dockerfile 或运行标志来完成?