Java、Hibernate、MySQL - 存储 UTC 日期时间

标签 java mysql hibernate date utc

我在 SO 上看到了一些相关问题(比如 this one,当然还有 this one)...本质上,我想要的是将日期时间存储为 UTC,并让应用程序用户选择时区他想显示日期时间。
由于日期时间字段似乎受到底层 JDBC 驱动程序的影响,我想知道这是否是存储 UTC 日期时间的可接受方式:

  • 将 MySQL 和应用服务器机器都设置为 UTC 时区(无需分开)
  • MySQL 和 JVM 都应该获取底层系统时间设置(如果没有另外指示)
  • 在 MySQL 端使用 DATETIME 表列
  • 使用 java.util.Date 作为 Hibernate 端的相应映射(我想 java.sql.Timestamp 也可以使用)
  • 让应用程序担心解释日期时间字段 - 即让用户选择首选时区

这样可以吗?

编辑
澄清 - 在这里我指的是严格在服务器上创建的时间戳(例如记录创建的日期时间)。因此,应用程序服务器实例化 Date 对象(new Date() 等于服务器上的当前日期时间,这实际上与时区无关)。
现在,如果客户端用户想要提供一些日期用于搜索/过滤目的,这里应该是从客户端本地时间到 UTC 的转换,恕我直言......

最佳答案

我会建议另一种独立于机器时区设置的简单方法。

  • 不是设置服务器机器的时区,而是设置 JVM 的时区。这可以通过系统属性来完成。在 Windows 上的示例如下
set JAVA_OPTS=%JAVA_OPTS% -Duser.timezone=GMT
  • 对于 MySQL here is the reference因为这样做。
  • 现在这确保您所有的日期时间都在格林威治标准时间
  • 将时区保留为可配置属性,或者它也可以依赖于用户。因此,如果用户属于不同的地理位置,则为每个用户存储时区。
  • 每当需要日期时,从数据库中选择日期后,应用时区以获得正确的时间。
  • 这种方法的优点是它适用于所有时区用户。这意味着用户将根据他们的时区看到正确的时间。

关于Java、Hibernate、MySQL - 存储 UTC 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18125924/

相关文章:

java - 使用特定子类查找行的条件查询

java - 对 hibernate 应用程序使用@Transactional 注释导致错误

java - 在最基本的示例中无法使用 @PersistenceContext 注入(inject) EntityManager

mysql - Flask + MySQL + PHP + Docker-Compose = 痛苦

java - 简单教程示例(lambda 表达式)不运行

java - 从 java 执行 MYSQL 命令时出现错误。相同的命令在 Linux 终端上运行良好。可能是什么原因?

php - 在PHP/MySQL中插入值时出现外键约束错误

Hibernate::组合列值

java - 重复类定义错误

java - 摆脱 derby.log