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

joh*_*ley 6 java gwt timezone google-app-engine 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点​​看到一个位置并预订.

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

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

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

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

com.google.gwt.i18n.client.TimeZone
Run Code Online (Sandbox Code Playgroud)

它不允许我使用该功能

TimeZone bizTimeZone=TimeZone.getTimeZone("Europe/London")
(which works for `java.util.TimeZone`)
Run Code Online (Sandbox Code Playgroud)

因为它会导致错误

"The method getTimeZone(String) is undefined for the type TimeZone"
Run Code Online (Sandbox Code Playgroud)

它建议改变它

com.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London")
Run Code Online (Sandbox Code Playgroud)

但是这个版本,期待一个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());
Run Code Online (Sandbox Code Playgroud)

但是当我开始使用"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)
Run Code Online (Sandbox Code Playgroud)

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

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,1133633,60,138673,0,142369,60,147409,0,151105,60,156145,0,19841,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,24844,0,247537,60,252577,0,256273,60,261481,0,2655009,60,2720217,0,273745,60,278953, 0,282649,60,2877689,0,291385,60,296425,0,300121,60,305329,0,308857,60,314065,0,317593,60,322801,0,326329,60,331537,0, 335233,60,3400273,0,343969,60,349009,0,352705,60,357913,0,361441,60,366649,0,370177,60,375385,0,379081,60,384121,0,3877817, 60,3 92857,0,396553,60,401593,0,405289,60,410497,0,414025,60,4199233,0,452761,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,492985,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}

Ril*_*ark 0

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

查看属性文件- 似乎它具有时区的所有标准名称。

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