从GAE服务器向GWT客户端发送日期和时区

时间:2012-08-16 14:21:00

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

好的伙计们,我已经解决了这个问题大约两个星期了,现在尝试我能想到的一切,并在这里看到大量的答案,感觉他们会回答它,但我只是无法弄清楚我是怎么做的我的意思是做我想要做的事情,这让我绝对坚持!似乎没有人在任何地方找到答案,到处都有一半的答案,但似乎没有人真正做我需要它做的事情,当然有人已经解决了这个问题!请原谅真正长的问题,但重要的是问题是正确的,所以答案实际上满足了需要! :d

如果您可能提供任何未考虑我的数据存储区/服务器是Google App Engine(GAE)并且我的客户端是用Google Web Toolkit编写的答案,请不要再费心阅读了。 (GWT),一切都是用Java编写的,我对Python或MySQL或PHP或其他任何东西都不了解

最后,如果有人知道一个更好的地方来计算这样的东西,请告诉我,因为我不断提出这样的问题,不知道如何找到除此之外的解决方案,或花费数小时和小时搜索谷歌的其他人已经设法找到它。我也不明白如何从JavaDocs中找出任何东西 - 对不起,但是直到有人向我解释,我才不会得到它

我有一个存储在服务器上的日期时间(显然是UTC)我还在服务器上为每个存储为字符串的业务所有者存储了一个TimeZone(例如"America/New_York")。此字符串是通过在服务器上使用java.util.TimeZone.getAvailableIDs()并让业务所有者为其业务选择相关时区获得的(如果他们不选择任何内容,则默认为"Europe/London" - 无需挂起我需要在将来的某个时刻将任何日期时间传递回客户端PC,在其PC上忽略本地时区,因为日期时间需要根据业务所有者的时区显示。

举例来说,企业主是伦敦的理发师,他们有在线预约时间表,任何潜在客户都可以查看。其中一位客户(也在伦敦)希望预约,在9月3日星期一上午9点​​在BST看到一个位置并预订。

然后将其作为UTC时间存储在数据存储区中(实际上是0800,因为BST是UTC + 1),当然业务所有者已选择"Europe/London"作为其时区。到目前为止一切都很好。

现在,在未来的某个时刻,客户正在纽约举行商务会议,并意识到他们在接下来的一周预约在伦敦理发,他们希望将其移动一周,所以他们然后尝试查看预约(在美发师预约簿中),但他们不想在纽约时间凌晨4点看到它,他们希望在英国时间上午9点看到它。

所以我的问题是当客户在9月3日点击VIEW约会时,服务器可以发回UTC日期时间0800和java.util.TimeZone ID字符串"Europe/London"

但是因为在客户端我只能使用

com.google.gwt.i18n.client.TimeZone

它不允许我使用该功能

TimeZone bizTimeZone=TimeZone.getTimeZone("Europe/London")
(which works for `java.util.TimeZone`)

因为它导致错误

"The method getTimeZone(String) is undefined for the type TimeZone"

它建议将其更改为

com.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London")

但是这个版本期待GWT com.google.gwt.i18n.client.TimeZoneConstants"对象" (示例显示在此消息的末尾)而不是java.util.TimeZone.createTimeZone()将接受的简单字符串。

我可以使用以下方法创建:

final TimeZoneConstants constTz = GWT.create(TimeZoneConstants.class);
final TimeZone timeZoneCali = TimeZone.createTimeZone(constTz.europeLondon());

但是当我开始使用"Europe/London"和/或我不知道如何将此对象存储到App Engine数据库中然后稍后检索它时,我不知道该怎么做。

顺便说一句,在评论文本中,我也尝试使用以下几行:

//Calendar tmad = new GregorianCalendar(TimeZone.getTimeZone("Europe/London"));
//Calendar cal = Calendar.getInstance(someTimeZone);
//DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//df1.setTimeZone(TimeZone.getTimeZone("Europe/London"));
//final TimeZone timeZoneClient = TimeZone.createTimeZone("Europe/London");
//dtf.format(date,timeZoneClient)

必须有一种标准的方式来做这件事,我真的不能成为第一个解决这个问题的人!

  

constTz.europeLondon()= {" transitions":[19394,60,24770,0,28130,   60,33506,0,36866,60,42242,0,45602,60,50978,0,54506,60,   59714,0,63242,60,68450,0,71978,60,77354,0,80714,60,86090,   0,89450,60,94826,0,98521,60,103561,0,107257,60,112297,0,   115993,60,121033,0,124729,60,129937,0,133633,60,138673,0,   142369,60,147409,0,151105,60,156145,0,159841,60,164881,0,   168577,60,173785,0,177313,60,182521,0,186217,60,191257,0,   194953,60,199993,0,203689,60,208729,0,212425,60,217465,0,   221161,60,226201,0,230065,60,235105,0,238801,60,243841,0,   247537,60,252577,0,256273,60,261481,0,265009,60,270217,0,   273745,60,278953,0,282649,60,287689,0,291385,60,296425,0,   300121,60,305329,0,308857,60,314065,0,317593,60,322801,0,   326329,60,331537,0,3335233,60,340273,0,343969,60,349009,0,   352705,60,357913,0,361441,60,366649,0,370177,60,375385,0,   379081,60,384121,0,387817,60,392857,0,396553,60,401593,0,   405289,60,410497,0,414025,60,419233,0,422761,60,427969,0,   431665,60,436705,0,440401,60,445441,0,449137,60,454345,0,   457873,60,463081,0,466609,60,471817,0,475513,60,480553,0,   484249,60,4899289,0,429985,60,498025,0,501721,60,506929,0,   510457,60,515665,0,519193,60,524401,0,528097,60,533137,0,   536833,60,541873,0,545569,60,550777,0,554305,60,559513,0,   563041,60,568249,0,571777,60,576985,0,580681,60,585721,0,   589417,60,594457,0],"姓名":[" GMT","格林威治标准时间"," BST",   "英国夏令时"]," id":"欧洲/伦敦"," std_offset":0}

2 个答案:

答案 0 :(得分:2)

我和v2.4有类似的问题。

我认为莱利·拉克是对的。

TimeZone.createTimeZone(“亚洲/东京”)在GWT 2.4中不起作用

但是,我发现我可以通过以下方式使用浏览器的默认设置来获取东京地区:

Date d = new Date();
TimeZone timezone = TimeZone.createTimeZone(d.getTimezoneOffset());

这是莱利·拉克为你提出的建议,因为欧洲伦敦有“std_offset”:0 ......

  

TimeZone timezone = TimeZone.createTimeZone(0);

答案 1 :(得分:0)

您是否尝试过TimeZone.createTimeZone("Europe/London");?至少在较新版本的GWT中,此方法接受一大堆名称,显然是“从CLDR和Olson时区数据库[原文如此]”准备的。该文档专门引用了您的用例:通过json传输时区。

请参阅the properties file - 它似乎具有时区的所有标准名称。

如果这不适合你,你可以用分钟传输时区的偏移量,然后用TimeZone.createTimeZone(offsetInMinutes)创建你的时区。