【问题标题】:Sending a date and timezone from GAE server to GWT client将日期和时区从 GAE 服务器发送到 GWT 客户端
【发布时间】:2012-08-12 22:10:25
【问题描述】:

好的,伙计们,我已经解决这个问题大约 2 周了,现在尝试了我能想到的一切,并在这里查看了大量的答案,感觉他们会回答这个问题,但我就是不知道我是如何解决这个问题的我打算做我想做的事,这让我绝对疯了!似乎没有人在任何地方都有答案,到处都有一半的答案,但似乎没有人真正做我需要做的事情,肯定有人以前解决过这个问题!请原谅这个非常长的问题,但正确地提出问题很重要,这样答案才能真正满足需求! :D

另外,如果您可能提供任何未考虑到我的数据存储/服务器是 Google App Engine (GAE) 并且我的客户端是用 Google Web Toolkit (GWT) 编写的答案,请不要再阅读任何内容) 并且一切都是用 Java 编写的,我对 Python 或 MySQL 或 PHP 或类似的东西一无所知

最后,如果有人知道一个更好的地方来解决这样的问题,请让我知道,因为我不断提出这样的问题并且不知道如何在此处找到解决方案,或者花费数小时和几个小时在谷歌上搜索已经设法弄清楚的其他人。我也不明白如何从 JavaDocs 中找出任何东西 - 抱歉,但在有人向我解释之前,我只是不明白

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

例如,企业主是伦敦的一名理发师,他们有一个在线预约时间表,可供他们的任何潜在客户查看。其中一位客户(也在伦敦)想要预约,在 9 月 3 日星期一 BST 上午 9 点看到一个空档并进行了预约。

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

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

所以我的问题是,当客户在 9 月 3 日点击查看约会时,服务器可以发回 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, 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], "名称": ["GMT", "格林威治标准时间", "BST", "英国夏令时间"], "id": "Europe/London", "std_offset": 0}

【问题讨论】:

  • 我可能遗漏了一些东西,但是你不能用 java.util.TimeZone 转换服务器端的日期并将转换后的日期发送到客户端吗?
  • 我不认为你能做到,对吧?当然,时区只是应用于日期本身的格式设置,除非您建议我应用时区,格式化为字符串然后解析它并作为字符串数组发回?例如string[]={"2012","09","03","09","00","00"};
  • 是的,这就是我的意思(抱歉没说清楚)
  • 没问题我目前正在测试它,至少是一个临时解决方案!仍然感到惊讶的是,没有更好的解决方案......
  • 通过查看文档,我看到的另一个解决方案是使用 com.google.gwt.i18n.client 包中的 TimeZone 和 TimeZoneConstants。也许像 TimeZone.createTimeZone(timeZoneConstants.europeLondno()) 之类的?

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


【解决方案1】:

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

【讨论】:

  • 偏移量根据日期而变化。因此,您可能会得到错误的时区。
【解决方案2】:

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

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

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

【讨论】:

  • 我试过 TimeZone.createTimeZone("Europe/London");它不适用于我当前的 GWT 2.2 版本,但我注意到 v2.4 可以升级到,所以我可以尝试一下......
  • 是的,我不知道它在哪个版本中可用。可能值得一试~
  • 我现在已经升级到 GWT 2.4(最新版本),com.google.gwt.i18n.client.TimeZone.createTimeZone("Europe/London") 行仍然使我的 GWT 客户端崩溃,文档指出:com.google.gwt.i18n.client.TimeZone.createTimeZone(String tzJSON)This factory method creates a time zone instance from a JSON string that contains the time zone information for desired time zone. Applications can get such a string from the TimeZoneConstants class
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多