【问题标题】:TimeZones in Google Web Toolkit (GWT), GAE & Google Cloud SQL (mySQL)Google Web Toolkit (GWT)、GAE 和 Google Cloud SQL (mySQL) 中的时区
【发布时间】:2016-12-29 16:36:10
【问题描述】:

当我在本地运行以下代码时,日期和时间正确返回为 UTC(在客户端)。当我在本地运行 GAE 服务器并写入驻留在 Google Cloud 中的 mySQL 数据库时,它也会正确地将日期存储为 UTC。

但是,当我将 web 应用程序部署到 Google App Engine (GAE) 时,时间存储为 UTC + 4 小时。 Google Cloud 中的同一个 mySQL 服务器设置为东部/纽约时区,这意味着 mySQL 服务器通过在我传递的 UTC 时间上增加 4 小时来补偿(它认为是)UTC。

换句话说,当 GAE 向它发送值时,mySQL 会增加 4 小时......但当我的本地服务器发送时不会。所以我想问题是,为什么当我运行本地 GAE 时它会正确存储,但在 GAE 上运行时会增加 4 小时?

TimeZone 对象来自 com.google.gwt.i18n.client.TimeZone 库。无论我的客户端或服务器位于何处,如何保证 UTC 日期时间?我的应用暂时不能依赖任何服务器,因为它大部分时间都处于离线状态。

private static Date getNowDateTimeUTC() {
    DateTimeFormat df = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss.SSS");
    String utcDateString = df.format(new Date(), TimeZone.createTimeZone(0));
    Date returnDate = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(utcDateString);
    returnDate.setTime((returnDate.getTime() / 1000) * 1000); // rid the milliseconds
    return returnDate;
}

【问题讨论】:

  • 避免使用 Date 类,它有缺陷。 Java 8 有 Instant 类。
  • GAE 仍然只支持 Java 7 :(
  • 我想知道以纪元秒为单位存储日期是否有意义...相同的存储大小...并且 mySQL 不会尝试调整日期的时区。

标签: java mysql google-app-engine gwt timezone


【解决方案1】:
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

也许你可以像这样设置你想要的时区。 Asia/Shanghai 替换你的时区!

【讨论】:

    【解决方案2】:

    我最终存储了自纪元以来的秒数,而不是实际的日期值。这样,mySQL 就不会尝试修复时区。

    【讨论】:

      【解决方案3】:

      在我公司的项目中,我们在客户端使用jsTimezoneDetect library 通过 JavaScript 检测时区。易于使用的库。

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多