编程语言
首页 > 编程语言> > java – 如何在解析日期时保留时区?

java – 如何在解析日期时保留时区?

作者:互联网

我解析了时区信息的日期,比如:1/7/2008 11:00:00 AM -0700. -0700对应于加利福尼亚州的当前时间偏移,因为我们现在在PDT.如果我解析它并显示:

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z")
    .parseDateTime("1/7/2008 11:00:00 AM -0700").toString()

我得到:2008-01-07T10:00:00.000-08:00.这是“正确的”,如上午10点-0800 =上午11点-0700,但我如何得到返回的日期以保持输入中的相同时间偏移(Z部分)?

作为旁注,使用java.text.SimpleDateFormat给出了类似的结果:new SimpleDateFormat(“M / d / yyyy hh:mm:ss a Z”).parse(“1/7/2008 11:00:00 AM – 0700“).toString()返回2011年1月7日10:00:00 PST 2008,PST = -0800,而我们现在在PDT.

解决方法:

您提供的日期是一月份,而不是白天.因此,如果您将这些时间视为太平洋时间,则-0800偏移是正确的.

但你没有指定像America / Los_Angeles这样的时区ID,那么为什么JodaTime会做出这样的假设呢?

对于DateTimeFormatter类,可以在the documentation中找到答案:

The underlying printer/parser can be altered to behave exactly as
required by using one of the decorator modifiers:

withLocale(Locale) – returns a new formatter that uses the specified locale
withZone(DateTimeZone) – returns a new formatter that uses the specified time zone
withChronology(Chronology) – returns a new formatter that uses the specified chronology
withOffsetParsed() – returns a new formatter that returns the parsed time zone offset
withPivotYear() – returns a new formatter with the specified pivot year
withDefaultYear() – returns a new formatter with the specified default year

The documentation为DateTimeFormatter.forPattern()方法说:

The format may contain locale specific output, and this will change as you change the locale of the formatter. Call DateTimeFormatter.withLocale(Locale) to switch the locale.

由于您不想使用特定的区域设置或时区,我相信您应该使用以下内容:

org.joda.time.format.DateTimeFormat.forPattern("M/d/yyyy hh:mm:ss a Z")
        .withOffsetParsed()
        .parseDateTime("1/7/2008 11:00:00 AM -0700").toString()

有关.withOffsetParsed()的行为,请参阅these docs,这正是您所询问的内容.

标签:java,jodatime,datetimeoffset
来源: https://codeday.me/bug/20190625/1284451.html