【发布时间】: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