2014-05-19 21 views
2

这是我的场景:我想解析用户给我的时间戳。如果时间戳没有时区信息,我想假设时间戳在用户的时区,如果时间戳确实定义了时区,请使用该时区。乔达时间:分析字符串和覆盖时区,如果时区被省略

下面是使它很难的部分:

  • 我无法设置DateTimeZone.setDefault(UserTimeZone),因为这将影响到所有服务器上的用户,证明这里:Switch Timezone for calculation
  • 我不能使用withOffsetParsed(),因为它不告诉我用户是否明确设置了时区或者它回到了默认值。
  • 我无法使用withZone(),因为它会覆盖字符串中的任何时区信息。

我想是这样的:

DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser() 
DateTimeZone userTimeZone = getUserTimeZone(); //assume -04:00 

//returns 2014-05-17T15:36:14+02:00 
parser.parseDateTime("2014-05-17T15:36:14+02:00", userTimeZone); 

//returns 2014-05-17T15:36:14-04:00 
parser.hasTimeZone("2014-05-17T15:36:14", userTimeZone); 

有没有简单的方法来做到这一点?

+0

没有,处理TZ是在A – Totoro

回答

1

我会把这个问题分成两部分。第一部分是确定字符串中是否包含时区信息。其次是按照你想要的方式解析字符串。

我相信以下内容适用于第一部分。首先,创建两个具有不同时区的DateTimeFormatter对象。现在,解析两个对象的字符串。现在在两个结果上调用getDate()。如果两个日期都相同,则字符串中有一个时区,并指定一个即时时间,并由两个DateTimeFormatter对象进行适当调整。如果日期不同,字符串中没有时区,并且指定了一个本地日期和时间,这被每个DateTimeFormatter假定为​​它自己的时区。

现在,您可以执行第二部分,根据字符串是否具有时区,选择在用户时区中是使用带有OffsetParsed()的DateTimeFormatter还是带有withZone()。

这需要四个不同的DateTimeFormatter对象,但如果不是简单的话,它很简单。它可以优化为仅使用三个不同的DateTimeFormatter对象,方法是将用户的时区用作解决方案第一部分中使用的两个对象之一 - 在这种情况下,必须在解决方案的第二部分重新分析只有当字符串中有一个时区时。

+0

无需调用'getDate'疼痛。 DateTime对象包含['isEqual'](http://www.joda.org/joda-time/apidocs/org/joda/time/base/AbstractInstant.html#isEqual(org.joda.time.ReadableInstant))方法。 –

+0

谢谢@warren,但是如果两个日期对象根据时间戳中存在或不存在时区信息进行不同解析,那么它们已经在做我想做的事情,而且我不需要比较这些值。 – etherton

0

原来我错了withZone()的工作原理。如果在时间戳中指定了时区信息,则它只会调整时间顺序,但从时期开始的基础毫秒数仍将保持不变,但如果未在时间戳中设置时区,则会偏移毫秒因为在给定时间段内时间是正确的时代。

我想,因为约达时间的文件说,

在解析时,该区域将在解析日期时间进行设置。

它会覆盖时区,但我错了。 withZone()正是我所需要的。

这是我最后使用的代码:

DateTimeZone timeZone = user.getTimeZone(); 
DateTime dateTime = ColumnTypeUtil.DATE_FORMATTER.withZone(timeZone).parseDateTime(formattedValue); 
String dbTimeStamp = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC).print(dateTime);