繁体   English   中英

乔达时间:解析字符串并覆盖时区(如果省略时区)

[英]Joda Time: Parse string and override time zone, if time zone is omitted

这是我的情况:我想解析用户给我的时间戳。 如果时间戳没有时区信息,那么我想假设时间戳位于用户的时区中,如果时间戳确实定义了它的时区,请使用它。

这是使工作变得困难的部分:

  • 我无法设置DateTimeZone.setDefault(UserTimeZone),因为这会影响服务器上的所有用户,如此处所示: 切换时区进行计算
  • 我不能使用withOffsetParsed(),因为它不会告诉我用户是否明确设置了时区,或者它回落为默认值。
  • 我不能使用withZone(),因为它会覆盖String中的任何时区信息。

我想要的是这样的:

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);

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

我将这个问题分为两个部分。 第一部分是弄清楚字符串中是否包含时区信息。 第二种是按所需的方式解析字符串。

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

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

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

原来我对withZone()的工作方式有误。 如果在时间戳中指定了时区信息,则只会调整时间顺序,但自该纪元以来的基础毫秒数仍将是相同的,但是如果未在时间戳中设置时区,则它将偏移毫秒数从使时间对给定时区正确的时代开始。

自从Joda Time文档说:

解析时,将在解析的日期时间设置此区域。

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

这是我最终使用的代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM