将 UTC 时间戳插入 MySQL - 夏令时时区

Posted

技术标签:

【中文标题】将 UTC 时间戳插入 MySQL - 夏令时时区【英文标题】:Insert UTC timestamp into MySQL - Daylight Savings timezone 【发布时间】:2018-03-04 08:42:23 【问题描述】:

我有一个 Java 客户端,它正在(通过 CSV 和“加载数据输入文件”)在 mysql 数据库中以 UTC 格式插入时间戳(类型 TIMESTAMP)。我服务器的时区是“America/New_York”,我需要保留夏令时信息。 11 月 5 日凌晨 2:00 是时间从 EDT 更改为 EST 并且时钟拨回一小时到凌晨 1:00。因此,例如,11 月 5 日凌晨 1:30 发生了两次;一次在美国东部时间,一次在美国东部时间。

如何让服务器区分这两者?例如,如果我想插入 '2017-11-05 01:30:00' EDT,有没有办法告诉 MySQL 区分 '2017-11-05 01:30:00' EDT(在时间变化)和'2017-11-05 01:30:00' EST(在时间变化之后)当我插入值时?如果重要的话,我的 Java 应用程序具有两个时间戳的时区信息。

我想将服务器的全球时区保留为“美国/纽约”,因为用户访问此数据并希望它以本地时间显示。

我想到的解决方案是从 Java 客户端将连接的时区设置为 UTC,在 UTC 中插入值,然后重新设置连接的时区,但我想知道是否有更好、更“标准”的解决方案.

【问题讨论】:

如果值是 UTC,则没有 DST 歧义。 2017-11-05T01:30 EDT2017-11-05T05:30 UTC 相同,2017-11-05T01:30:00 EST2017-11-05T06:30 UTC 相同。 我知道。我的问题是,我在 Java 中有 2 个时间戳。一个是“2017-11-05 01:30:00” EDT,另一个是“2017-11-05 01:30:00” EST。如何将两者都插入 TIMESTAMP 类型的 MySQL 字段中,即 UTC?我需要先在Java中将它们转换为UTC然后插入它们,还是有更好的方法? 当您说 timestamp 时,您的意思是 java.sql.Timestamp 还是其他类型? 我现在将它作为 ZonedDateTime 我知道 JDBC 4.2 支持java.time 类,我猜大多数主要的数据库供应商已经实现了各自的驱动程序。所以,我相信只需将ZonedDateTime 转换为Instant(调用toInstant() 方法)并保存Instant 可能会起作用。或者,对于 JDBC Timestamp.from(zoneddatetime.toInstant()) 将其转换为 java.sql.Timestamp 并保存时间戳(我很久以前使用 mysql,但我认为 TimestampInstant 类映射到 TIMESTAMP 字段- 但我会检查文档以确保) 【参考方案1】:

在纽约或东部时区使用 jodaTime api http://joda-time.sourceforge.net/timezones.html Why this Joda offset cannot get daylightsaving right

【讨论】:

虽然是一个很棒的 AP​​I,但 Joda-Time 处于维护模式,正在被新的 API 取代。即使在joda's website 中,它也说:“请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310 )。” - 无论如何,OP 告诉它正在使用 ZonedDateTime (Java 8),所以真的没有理由使用 Joda-Time。

以上是关于将 UTC 时间戳插入 MySQL - 夏令时时区的主要内容,如果未能解决你的问题,请参考以下文章

PHP 处理夏令时的时区

如何获取另一个时区的夏令时状态

时间模块

R 中的时区问题,我想使用 UTC+0100,即使在夏天,尽管 CET 会自动切换到 CEST

针对当前时区调整的不同夏令时的UTC日期[重复]

在 php 中从 EDT 转换为 GMT+05.30 时区以在 mysql 数据库中输入时间戳