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

时间:2010-04-27 21:57:24

标签: gwt timezone jodatime

我在客户端(浏览器)上使用GWT,在服务器上使用Joda Time。我希望执行一些数据库查找,这些查询以当天(即00:00:00至23:59:59)为限,请求进入,时间边界基于用户(即浏览器)时区。

所以我让GWT代码执行new java.util.Date()来获取请求的时间,并将其发送到服务器。然后我像这样使用Joda Time:

new DateTime(clientDate).toDateMidnight().toDateTime()

当然,麻烦的是toDateMidnight(),如果没有指定的TimeZone,将使用系统(即服务器的)TimeZone。我一直试图找到一种简单的方法将TimeZone从浏览器传递到服务器而没有太多运气。在GWT中,我可以通过以下方式获得GMT偏移:

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

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

4 个答案:

答案 0 :(得分:4)

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

AFAIR,您可以在Joda时间指定类似“UTC + 4”的内容。

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

答案 1 :(得分:1)

Gwittir(http://www.gwtsite.com)是一个GWT库,包含许多很酷的实用程序,如数据绑定,动画,反射等。然而,还有一些其他有趣的好东西以及新的Joda Time集成。如果你对GWT缺乏java.util.Calendar支持感到沮丧,你会喜欢这个,因为它可以很容易地在你的应用程序中进行日期操作。

答案 2 :(得分:0)

否则,还有其他方法可以通过+& -

import java.util.TimeZone;

使用:TimeZone.getDefault()。getRawOffset()

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

经过一些操作后得到你想要的号码。

答案 3 :(得分:0)

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

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

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

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

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

我觉得解决这个问题的最佳方法就是单独存储每个约会的时区偏移量,但我觉得能够首先正确确定原始时区会好得多,然后让java做正确的调整。