Google Web 工具包 (GWT)、GAE 和 Google 云中的时区 SQL (mySQL)

TimeZones in Google Web Toolkit (GWT), GAE & Google Cloud SQL (mySQL)

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

但是,当我将 webapp 部署到 Google App Engine (GAE) 时,时间存储为 UTC + 4 小时。 Google 云中的同一 mySQL 服务器设置为 Eastern/NY 时区,这意味着 mySQL 服务器通过将 4 小时添加到(它认为的)UTC 来补偿我在 UTC 时间过去了。

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

TimeZone 对象来自 com.google.gwt.i18n.client.TimeZone 库。无论我的客户端或服务器位于何处,我如何才能 gua运行tee 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;
}
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

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

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

在我公司的项目中,我们在客户端使用 jsTimezoneDetect library 来检测 JavaScript 的时区。图书馆很容易使用。