从客户端(GWT)传递时区到服务器(Joda Time)

7
我正在客户端(浏览器)使用GWT,服务器上使用Joda Time。我想执行一些DB查找,限定在请求到达的日期(即从00:00:00到23:59:59),时间范围基于用户(即浏览器)的时区。
因此,我让GWT代码执行new java.util.Date()以获取请求时间,并将其发送到服务器。然后我这样使用Joda Time:
new DateTime(clientDate).toDateMidnight().toDateTime()

当然问题在于,如果没有指定时区,toDateMidnight()会使用系统(即服务器)的时区。我一直试图找到一种简单的方法将浏览器中的时区传递到服务器端,但并没有什么好的办法。在GWT中,我可以使用以下代码获取GMT偏移量:
DateTimeFormat.getFormat("Z").fmt(new Date())

这会得到类似于“-0400”的结果。但是Joda Time的DateTimeZone.forID()希望字符串格式为“America/New_York”,或者一个小时和分钟的整数参数。当然,我可以将“-0400”解析为-4小时和0分钟,但我想知道是否有更简单的方法。

4个回答

4
你可以使用java.util.Date的getTimezoneOffset()方法。虽然已经过时,但在当前GWT中处理日期通常都是这样的。
我记得在Joda时间中可以指定类似于“UTC+4”的内容。
更新:我查了一下,应该是“+04:00”。或者使用DateTimeZone.forOffsetHours()甚至forOffsetMillis()。

是的,使用java.util.Date.getTimezoneOffset()肯定比字符串解析更好。它已经被弃用了,但显然在GWT中仍然实现。至少在我的浏览器中对于EDT它可以正确地工作。 - George Armhold
不要太担心在GWT中使用过时的Date方法 - 只需查看com.google.gwt.user.datepicker.client.CalendarUtil即可... 不过我不会在GWT之外这样做,希望GWT能尽快在这方面得到改进! - Chris Lercher
实际上,有些奇怪- Date.getTimezoneOffset() 对我返回(正数)240。由于我在克利夫兰(EDT),我希望这是-240(即我比GMT晚4小时)。而且这是在Java单元测试中,甚至不是GWT。 - George Armhold
请避免使用“Etc/”格式,而是使用+04:00 - http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeZone.html#forID%28java.lang.String%29。 - JodaStephen
date.getTimeZoneOffset() 如果返回例如 300,那么有可能在某个时间点它是 CDT,在另一个时间点它是 EST,对吗?我们如何确信给定的偏移量数字肯定是 EST 还是 CDT? - Barry

1

Gwittir(http://www.gwtsite.com)是一个为GWT开发的库,包含了诸多实用工具,例如数据绑定、动画、反射等。此外,还有其他很有趣的功能,如新的Joda Time集成。如果您曾经因为GWT缺乏java.util.Calendar支持而感到不满,那么您一定会喜欢这个库,因为它可以轻松地在应用程序中进行日期操作。


似乎它已经不再由其创建者维护。 - expert

0
否则,还有其他方法可以使用+和-获取时区偏移量。
导入java.util.TimeZone;
使用:TimeZone.getDefault().getRawOffset()
此函数将返回关于您的手机设置的偏移时间(以毫秒为单位)。例如,GMT-04:00等于(-4)*60*60*1000 = -14400000。
进行一些操作以获取所需数字。

不幸的是,在GWT中无法使用java.util.TimeZone。但是,如果您已经有这样一个TimeZone对象,可能可以使用com.google.gwt.i18n.client.TimeZone.getOffset(Date) - Chris Lercher

0

我有一个类似但略有不同的问题。

实际上,我需要在服务器上存储客户端的时区,以便我可以发送关于存储在他们日历中的日期的消息。

这些日期以UTC时间在Google应用引擎中存储,当然我可以在创建约会时存储当前时区偏移量。问题出现在例如我想发送一封包含即将到来的约会列表的摘要电子邮件时。这些约会需要根据客户端的正确时区调整偏移量(我很乐意假设他们仍处于创建约会时的同一时区)。

真正的问题出现在夏令时调整方面,例如我可能已经为2010年10月30日星期六下午1点(BST [GMT + 60])和2010年11月1日星期一下午1点(GMT)存储了约会。

因此,您可以想象,我不能只使用当前的时区偏移量(BST),因为这意味着11月1日星期一的约会将被列为下午2点而不是下午1点(GMT + 60)

我想到最好的处理方法就是仅针对每个约会单独存储时区偏移量,但我认为能够正确确定原始时区然后让Java进行正确的调整会更好。


刚刚发现了这个非常好的博客/代码,它至少部分地涉及了这个问题,但仍然没有处理夏令时转换日期。http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/ - johnvdenley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接