【发布时间】: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 字段- 但我会检查文档以确保)
标签: java mysql timezone utc dst