将String转换为java.time.ZonedDateTime

时间:2018-07-19 04:58:06

标签: java time java-time datetime-parsing zoneddatetime

我想在解析数组列表的元素后将其转换为ZonedDateTime对象。字符串如下所示。

"2017-02-12 06:59:00 +1300"

此刻,我使用DateTimeFormatter

DateTimeFormatter dateTimeFormatter =
  DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss ZZ");

并尝试使用parse来获取时间:

this.actionTime = dateTimeFormatter.parse(actionTime, ZonedDateTime::from);

请参见以下方法:

public DateCalculatorTest(String actionTime, int expectedDayOfWeek) {
    DateTimeFormatter dateTimeFormatter = 
      DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss ZZ");
    DateTimeFormatter localTimeFormatter = 
      DateTimeFormatter.ofPattern("YYYY-MM-dd");
    this.actionTime = dateTimeFormatter.parse(actionTime, ZonedDateTime::from);
    this.expectedDayOfWeek = expectedDayOfWeek;
}

但是,我无法解析该字符串。我收到以下错误:

Text '2017-02-12 06:59:00 +1300' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2017, DayOfMonth=12, MonthOfYear=2, OffsetSeconds=46800},ISO resolved to 06:59 of type java.time.format.Parsed

是否可以使用java.time来做到这一点?

2 个答案:

答案 0 :(得分:3)

在DateFormator年中应将小写字母替换为

 YYYY-MM-dd HH:mm:ss ZZ

使用

yyyy-MM-dd HH:mm:ss ZZ

您不需要两个ZZ单就足够了。在您的代码中,ZoneId实例将为您提供默认的ZoneId,它将回退到LocalDateTime。如果要指定ZoneId,请按以下步骤使用

this.actionTime =  ZonedDateTime.parse(actionTime, dateTimeFormatter.withZone(ZoneId.of(<<yourxoneid>>)));

答案 1 :(得分:2)

我设法使用以下方法解决此问题:

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss ZZ");
    DateTimeFormatter localTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    this.symbol = symbol;
    this.actionTime = ZonedDateTime.parse(actionTime, dateTimeFormatter);
    this.actionDate = LocalDate.parse(expectedResult, localTimeFormatter);