Google App Engine - GAE不会设置默认TimeZone

时间:2013-05-21 14:17:53

标签: java google-app-engine

我尝试了以下内容,因此我可以根据我的时区"Africa/Johannesburg"GMT+2:00获取日期,但Google服务器始终使用自己的时区返回时间,该时区比我的时区落后2小时。

我做了FF:

appengine-web.xml我已设置

<property name="user.timezone" value="Africa/Johannesburg"/>

在创建Date对象

之前,我还尝试了TimeZone.setDefault(TimeZone.getTimeZone("GMT+2:00"));

在我的servlet的init方法中,我也试过

@Override
    public void init() throws ServletException {
         TimeZone.setDefault(TimeZone.getTimeZone("GMT+2:00"));
    }

但这件事不会起作用。因为JDK日期不是线程安全的,所以我使用JodaTime,效果很好,事实上当我new DateTime(DateTimeZone.forID("Africa/Johannesburg"))时我得到正确的时间但是对于遗留问题,我必须将日期存储在JDK日期,因此必须将Joda转换为JDK Date通过调用.Date(),然后时间完全搞砸了错误的时区。

有没有人偶然知道如何设置它而不必减去小时差异。

2 个答案:

答案 0 :(得分:2)

你做不到。系统时区不可更改。您应该将所有日期存储在unix时间,并使用您的时区将它们转换为日期或日历对象。我也不会认为GAE总是会使用相同的时区...

答案 1 :(得分:0)

当您在数据存储中保存任何日期时,它将保存在您在JVM中设置的timeZone中,这就是为什么在启动应用程序之前我始终将其设置为UTC:

//To avoid difference of dates depending on where the server is located
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

尽管如此,当您在gcloud控制台中浏览数据存储区时,它将显示在您当地的时区中(可能它会获取浏览器时区并根据您的需要调整响应)。但是当你查询它时,计数中的日历日期将是你用来保存日历的日期(在我的情况下是UTC)。