【发布时间】: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