将 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 EDT
与 2017-11-05T05:30 UTC
相同,2017-11-05T01:30:00 EST
与 2017-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,但我认为 Timestamp
和 Instant
类映射到 TIMESTAMP 字段- 但我会检查文档以确保)
【参考方案1】:
在纽约或东部时区使用 jodaTime api http://joda-time.sourceforge.net/timezones.html Why this Joda offset cannot get daylightsaving right
【讨论】:
虽然是一个很棒的 API,但 Joda-Time 处于维护模式,正在被新的 API 取代。即使在joda's website 中,它也说:“请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310 )。” - 无论如何,OP 告诉它正在使用ZonedDateTime
(Java 8),所以真的没有理由使用 Joda-Time。以上是关于将 UTC 时间戳插入 MySQL - 夏令时时区的主要内容,如果未能解决你的问题,请参考以下文章