【问题标题】:Insert UTC timestamp into MySQL - Daylight Savings timezone将 UTC 时间戳插入 MySQL - 夏令时时区
【发布时间】: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 字段- 但我会检查文档以确保)

标签: java mysql timezone utc dst


【解决方案1】:

【讨论】:

  • 虽然是一个很棒的 AP​​I,但 Joda-Time 处于维护模式,正在被新的 API 取代。即使在joda's website 中,它也说:“请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310 )。” - 无论如何,OP 告诉它正在使用 ZonedDateTime (Java 8),所以真的没有理由使用 Joda-Time。
猜你喜欢
  • 2012-04-07
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2014-08-11
  • 2018-10-06
  • 2015-07-31
相关资源
最近更新 更多