java - 将日期和时区从 GAE 服务器发送到 GWT 客户端

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

好的伙计们,我已经解决这个问题大约 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 日星期一上午 9 点看到一个空档并进行预订。

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

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

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

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

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, 335233, 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, 489289, 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], "names": ["GMT", "Greenwich Mean Time", "BST", "British Summer Time"], "id": "Europe/London", "std_offset": 0}

最佳答案

我对 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);

关于java - 将日期和时区从 GAE 服务器发送到 GWT 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11989219/

相关文章:

java - 删除具有空值的 treeMap 条目

java - Android:如何将文件写入内部存储

url - GWT 编码的查询参数应该如何在服务器端解码?

java - 具有多个 Action 的形式?

java - log4j.properties 被忽略

python - 如何正确理解 "cursor"

java - 以编程方式创建任务队列

google-app-engine - GAE 搜索 API - 对 Twitter 风格的扇出有用吗?

java - 如何在 GWT maven 项目中使用一个简单的 maven 项目作为依赖项?

java - Eclipse + GWT -> 开发模式内存不足