java.time.format.DateTimeParseException:无法从TemporalAccessor以格式ddMMyyyyhhmmss获取ZonedDateTime

时间:2019-03-28 10:09:16

标签: java date datetime time zoneddatetime

我在将字符串格式化为ZonedDateTime时遇到麻烦。
我的客户希望使用ddMMyyyyhhmmss之类的日期作为日期,而没有分隔符或类似的内容。
这是我到目前为止所做的

import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;


public class MyClass {
    public static void main(String args[]) {

            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyyhhmmss");
            String test = formatter
            .format(ZonedDateTime.now()).toString();
            System.out.println(test);
            ZonedDateTime a = ZonedDateTime.parse(test,formatter);
            System.out.println(a.toString());
    }
}

虽然正确生成了字符串,但在创建LocalDateTime变量的解析过程中发生了错误

28032019100707

Exception in thread "main" java.time.format.DateTimeParseException: Text '28032019100707' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at MyClass.main(MyClass.java:14)
Caused by: java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.ZonedDateTime.from(ZonedDateTime.java:565)
    at java.time.format.Parsed.query(Parsed.java:226)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    ... 2 more
Caused by: java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.ZoneId.from(ZoneId.java:466)
    at java.time.ZonedDateTime.from(ZonedDateTime.java:553)
    ... 4 more
Command exited with non-zero status 1

在SO上进行搜索时,我发现对同一问题的一些答案建议使用LocalDateTime类作为中间对象,然后解析为ZonedDateTime,但它仍然无法正常工作,并抛出相同的错误。 我还尝试通过此过程更改初始化DateTimeFormatter的方式

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("ddMMyyyyhhmmss")
                          .toFormatter()
                          .withZone(ZoneId.systemDefault());

但是它仍然无法正常工作。我知道我肯定会缺少一些愚蠢的东西,但是我看不到。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

您要:

  String test = ZonedDateTime.now().format(formatter);

答案 1 :(得分:1)

ddMMyyyyhhmmss不包含任何区域信息,它不是ZonedDateTime,应为LocalDateTime

答案 2 :(得分:0)

在您解析的字符串中,没有有关TimeZone的信息-那么格式化程序应如何知道如何转换为ZonedDateTime?

您要么需要在字符串中包含TimeZone信息,要么使用另一个Object将其解析为没有TimeZone信息的信息,然后将其传输到所需的区域中。