【问题标题】:MySql Applications in Different Time Zones Give Different Results不同时区的MySql应用给出不同的结果
【发布时间】:2016-04-18 23:41:11
【问题描述】:

当然,标题是预期的结果,但我不知道如何修复它。我的生产服务器在 MST 中运行 MySql。我在 EST 本地测试我的应用程序。

我们正在使用 Joda 时间。麻烦就在这里:

DateTime nowTime = new DateTime();
DateTime endTime = myObject.getEndTime();
Duration duration = new Duration(nowTime, endTime);

if(duration.getStandardMinutes() < 15) {
    //do something time critical
}

当然,当应用程序在 MST 中运行时,这可以正常工作,但对于运行 EST 的本地应用程序,它会因时区差异而关闭。

有谁知道如何解决这个问题?假设更改 MySql 服务器上的默认时区不是一个选项,因为我们有共享它的旧应用程序。理想情况下,我们可以将时区设置为 GMT,这样我们就可以获得 UTC 时间。

编辑:有谁知道是否有任何方法可以避免在检索时从 UTC 更改为当前时区(参见文档下方的粗体)?

当前会话时区设置会影响 区域敏感的时间值。这包括价值观 由 NOW() 或 CURTIME() 等函数显示,以及存储的值 在 TIMESTAMP 列中并从中检索。 TIMESTAMP 列的值 从当前时区转换为 UTC 进行存储,并从 UTC 到当前时区进行检索。

或者是在检索后 以编程方式将其转换回 UTC 的唯一选择吗?

【问题讨论】:

  • 您可以在 MySQL 中设置每个连接的时区。
  • 或者你可以在 MySQL 中使用convert_tz()dev.mysql.com/doc/refman/5.5/en/…
  • @Barmar 你可以吗?我似乎找不到任何关于如何做到这一点的文档。如果可以的话,我相信这就是解决方案。
  • @Barmar 每个连接字符串都比修改每个 sql 存储过程来做到这一点要好。
  • SET SESSION time_zone = xxx

标签: java mysql datetime timezone jodatime


【解决方案1】:

设置查询连接的时区:

SET SESSION time_zone = 'UTC'

你可以省略SESSION——设置系统变量默认为会话变量。请参阅SET Syntax 文档。

如果您没有在数据库中配置时区信息,请参阅convert_tz returns null

您也可以使用数字时区:

SET time_zone = '+00:00'

【讨论】:

  • 对我来说有点新意。我正在使用 MySql Ver 14.14 Distrib 5.5.29,用于 Linux (x86_64),使用 readline 5.1。使用:使用 mysql;从time_zone_name中选择*;不返回任何行。当然,将会话设置为“EST”会导致找不到时区。
  • 感谢 Barmar,这是一个很好的教训。但是,我想我希望能够在连接字符串中设置它。有没有办法做到这一点?会话设置在某些情况下很有帮助,但宁愿让应用程序本身通过其数据库连接使用 UTC。
  • 据我所知没有。
【解决方案2】:

您可以使用以下代码获取 UTC/GMT 日期时间

System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多