【问题标题】:Date in UTC in mysqlmysql中UTC日期
【发布时间】:2011-05-23 15:58:31
【问题描述】:

我有一个表,其字段的数据类型为 DATETIME。我使用 java 在此表中保留一条记录,并按如下方式计算当前日期。

Date date = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime();

但是当我检查我的表格时,它再次将这个时间转换为本地时区。

有人可以向我解释一下,如何在数据库中以 UTC 时区存储日期。

@代码

我有一个数据库实体 'Referral' 对应于日期成员数据类型为 java.util.Date 的表,并使用休眠来保存它。

Referral ref = new Referral();
ref.setCreationDate(Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime());
referralDAO.save(ref);

谢谢

吉腾德拉

【问题讨论】:

  • 向我们展示您用于检索和解释 DATETIME 的代码,这可能是问题所在。
  • 数据库连接属性是否与它有关?
  • 在您的代码中,当您调用 calendarInstance.getTime() 时,您所做的所有时区工作都会丢失。两个问题: 1. 你确定没有存储正确的值吗?尝试更改机器的时区。如果结果随后以新时区显示,则您的数据是正确的,这只是一个演示问题。 2. 您的数据库架构是什么——您使用的是 DateTime 还是 Timestamp?见dev.mysql.com/doc/refman/5.1/en/datetime.html
  • 我在 mysql 中使用 DateTime。我直接使用mysql客户端查看数据库记录。
  • @dilium, "在您的代码中,当您调用 calendarInstance.getTime() 时,您所做的所有时区工作都将丢失。" 那么我们如何在 UTC 中保留时间。

标签: java mysql datetime timestamp


【解决方案1】:

MySql DATETIME 以与时区无关的方式存储。它只存储年/月/日/小时/分钟/秒

您如何解释该信息取决于您和您的应用程序。 如果您将其存储为 UTC,那么当您检索它时,您必须确保也将其解释为 UTC。

您可能对这个 SO 问题感兴趣:How can I get the current date and time in UTC or GMT in Java?

正如该问题的答案所述:

java.util.Date 是 always 在 UTC 中。 是什么让你认为它在本地 时间?我怀疑问题是 您正在通过实例显示它 使用本地的日历 时区,或可能使用 Date.toString() 也使用 当地时区。

【讨论】:

  • 我正在尝试以 UTC 存储,但它正在存储在本地时区。
  • 查看@Dilum Ranatunga 的评论 - 您确定它没有以 UTC 格式存储,还是只是演示文稿?尝试从 mysql 的命令行界面中执行 SELECT,以删除所有重新解释层
  • @Jitendra - 你看过Referral,正如我在对主要问题的评论中提到的那样?
【解决方案2】:

Java 中的日期很长。它与任何时区无关。当您通过 JDBC 驱动程序将日期/时间戳传递给数据库时,它会将其解释为会话时区中的时间,即您的 JVM 时区。

某些数据库(如 Oracle 和 PostgreSQL)的数据类型为 TIMESTAMP WITH TIMEZONE。我不相信 MySQL 有它。您可以将 JVM 时区切换为 UTC,也可以使用字符串字段并使用 SimpleDateFormat 格式化您的日期。

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2012-05-18
    • 2015-06-20
    • 2013-08-10
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多