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

将时区从客户端(GWT)传递到服务器(Joda Time),gwt,timezone,jodatime,Gwt,Timezone,Jodatime,我在客户端(浏览器)上使用GWT,在服务器上使用Joda Time。我希望执行一些以请求到达的日期(即00:00:00到23:59:59)为边界的DB查找,时间边界基于用户(即浏览器)时区 因此,我让GWT代码执行一个newjava.util.Date(),以获取请求的时间,并将其发送到服务器。然后我使用乔达时间,就像这样: new DateTime(clientDate).toDateMidnight().toDateTime() 当然,问题是在没有指定时区的情况下,toDateMidnig

我在客户端(浏览器)上使用GWT,在服务器上使用Joda Time。我希望执行一些以请求到达的日期(即00:00:00到23:59:59)为边界的DB查找,时间边界基于用户(即浏览器)时区

因此,我让GWT代码执行一个
newjava.util.Date()
,以获取请求的时间,并将其发送到服务器。然后我使用乔达时间,就像这样:

new DateTime(clientDate).toDateMidnight().toDateTime()
当然,问题是在没有指定时区的情况下,
toDateMidnight()
,将使用系统(即服务器)的时区。我一直在试图找到一种简单的方法,将时区从浏览器传递到服务器,但运气不太好。在GWT中,我可以通过以下方式获得GMT偏移:

DateTimeFormat.getFormat("Z").fmt(new Date())

这会导致类似于“-0400”的结果。但是Joda Time的
DateTimeZone.forID()
希望字符串的格式像“America/New_York”,或者是小时和分钟的整数参数。当然,我可以将“-0400”解析为-4小时零分钟,但我想知道是否有更直接的方法来实现这一点。

您可以使用java.util.Date的
getTimezoneOffset()
方法。它已经被弃用了,但这在GWT中是非常常见的日期处理方法

在AFAIR中,您可以在Joda time中指定类似于“UTC+4”的内容


更新:我查了一下,结果是“+04:00”。或者使用
DateTimeZone.forOffsetHours()
甚至
forOffsetMillis()

否则,还有其他方法可以通过+&-获得时区偏移

导入java.util.TimeZone

用法:TimeZone.getDefault().getRawOffset()

此函数将以毫秒为单位返回手机搜索的偏移时间。例如,GMT-04:00等于(-4)*60*60*1000=-14400000


经过一些操作以获得所需的号码。

Gwittir()是一个GWT库,其中包括许多很酷的实用程序,如数据绑定、动画、反射等。然而,还有一些其他有趣的东西,比如新的Joda Time integration。如果您曾经因为GWT缺乏java.util.Calendar支持而感到沮丧,那么您一定会喜欢它,因为它使您的应用程序中的日期操作变得很容易。

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

我实际上需要将客户机的时区存储在服务器上,这样我就可以发送有关存储在其日历中的日期的消息

日期以UTC时间存储在google app engine中,当然我可以在创建约会时存储当前时区偏移量。例如,当我想发送一封包含即将到来的约会列表的摘要电子邮件时,问题就出现了。这些约会需要为客户进行正确的时区调整来抵消(我很高兴假设它们仍然与创建约会时在同一时区)

真正的问题在于夏令时调整,例如,我可能会将2010年10月30日星期六下午1点(英国夏令时[GMT+60])和2010年11月1日星期一下午1点(GMT)的约会存储起来

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


我突然想到,处理这个问题的最好方法就是单独存储每个约会的时区偏移量,但我觉得最好首先能够正确地确定原始时区,然后让java进行正确的调整。

是的,使用java.util.Date.getTimezoneOffset()当然比字符串解析更好。它已被弃用,但显然仍在GWT中实现。至少它可以在我的EDT浏览器中正常工作。不要担心在GWT中过多地使用不推荐的日期方法-只要看看
com.google.GWT.user.datepicker.client.CalendarUtil
。。。不过,我不会在GWT之外做这件事,我希望GWT很快会在这方面有所改进!事实上,Date.getTimezoneOffset()对我来说返回(正)240。由于我在克利夫兰(美国东部时间),我预计这将是-240(即我比格林尼治标准时间晚4小时)。这是在Java单元测试中,甚至不是GWT。请避免使用“Etc/”格式-只需使用+04:00-date.getTimeZoneOffset(),如果它返回例如300,那么它可能在一个时间点是CDT,在另一个时间点是EST,对吗?我们如何才能确定给定的偏移量是确定的EST或CDT?不幸的是,
java.util.TimeZone
在GWT中不可用。但是,如果你已经有了这样一个时区对象,那么可以使用
com.google.gwt.i18n.client.TimeZone.getOffset(Date)
。刚刚发现了这个非常好的博客/代码,它至少部分地解决了这个问题,但是它仍然没有处理DST切换的日期。它似乎不再由它的创建者维护。