6

好的,伙计们,我已经解决这个问题大约 2 周了,现在尝试了我能想到的一切,并在这里查看了大量的答案,感觉他们会回答这个问题,但我就是不知道我是怎么想的做我想做的事,这让我绝对疯了!似乎没有人在任何地方都有答案,到处都有一半的答案,但似乎没有人真正做我需要做的事情,肯定有人以前解决过这个问题!请原谅这个非常长的问题,但正确地提出问题很重要,这样答案才能真正满足需求!: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 日星期一 BST 上午 9 点看到一个空档并进行预约。

然后将其作为 UTC 时间(实际上是 0800,因为 BST 是 UTC+1)存储在 Datastore 中,当然,企业主已经选择"Europe/London"了他们的时区。到目前为止一切都很好。

现在,在未来的某个时间点,客户在纽约参加商务会议,并意识到他们在下周有一个在伦敦理发的预约,并且他们想将它提前一周,因此他们尝试查看预约(在美发师预约簿中),但他们不想将其视为纽约时间凌晨 4 点,而是希望将其视为英国时间上午 9 点。

所以我的问题是,当客户在 9 月 3 日点击查看约会时,服务器可以发回 UTC 日期时间 0800 和java.util.TimeZoneID 字符串"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()={"转换": [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, 1122 115993, 60, 121033, 0, 124729, 60, 129937, 0, 133633, 60, 138673, 0, 142369, 60, 147409, 0, 151105, 60, 156145, 0, 164781, 0,60, 159841, 0,60, 60, 173785, 0, 177313, 60, 182521, 0, 186217, 60, 191257, 0, 194953, 60, 199993, 0, 203689, 60, 208729, 0, 212425, 0, 60, 2176,25 226201, 0, 230065, 60, 235105, 0, 238801, 60, 243841, 0, 247537, 60, 252577, 0, 256273, 60, 261481, 0, 265009, 60, 7870217, 0,20, 265009, 60, 7870217, 0,20, 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, 335233, 60, 340273, 0, 343969, 60, 349009, 0, 352705, 60, 357913, 0, 361441, 60, 366649, 0, 3708177, 0,60, 3708177, 0,60, 60, 384121, 0, 387817, 60, 392857, 0, 396553, 60, 401593, 0, 405289, 60, 410497, 0, 414025, 60, 419233, 0, 422761, 0, 60, 42796, 6, 3, 436705, 0, 440401, 60, 445441, 0, 449137, 60, 454345, 0, 457873, 60, 463081, 0, 466609, 60, 471817, 0, 475513, 60, 488553, 60, 488553, 60, 488553, 0, 0, 48 0, 492985, 60, 498025, 0, 501721, 60, 506929, 0, 510457, 60, 515665, 0, 519193, 60, 524401, 0, 528097, 60, 533137, 0, 53687, 0, 53687, 33, 4, 545569, 60, 550777, 0, 554305, 60, 559513, 0, 563041, 60, 568249, 0, 571777, 60, 576985, 0, 580681, 60, 585721, 0, 59445, 7, 0, 060 names": ["GMT", "Greenwich Mean Time", "BST", "British Summer Time"],“id”:“欧洲/伦敦”,“std_offset”:0}

4

2 回答 2

2

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

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

TimeZone.createTimeZone("Asia/Tokyo")在 GWT 2.4 中不起作用

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

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

这确实是 Riley Lark 对你的建议,因为 europeLondon 有 "std_offset": 0 ...

TimeZone timezone = TimeZone.createTimeZone(0);

于 2012-08-17T02:12:58.023 回答
0

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

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

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

于 2012-08-16T19:03:47.390 回答