【问题标题】:Parse ZonedDateTime.now() with DateTimeFormatter in Java在 Java 中使用 DateTimeFormatter 解析 ZonedDateTime.now()
【发布时间】:2018-08-06 23:02:43
【问题描述】:

我正在尝试以特定格式解析当前时间戳,但每次尝试我都会收到java.time.format.DateTimeParseException。我的代码:

ZonedDateTime.parse(
    ZonedDateTime.now().toString(),
    DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS")
            .withZone(ZoneId.of("UTC")) //I also tried ZoneId.systemDefault()
)

结果:

java.time.format.DateTimeParseException:
Text '2018-02-27T11:01:18.776+01:00[Europe/Berlin]' could not be parsed at index 2

问题是为什么我不能解析成想要的格式以及如何实现呢?

附:我还看到this 的帖子并尝试设置ZoneId,但没有帮助。

【问题讨论】:

  • 你的预期输出是什么?
  • 呃...那些在formatter参数中指定的。
  • 试试ZonedDateTime.now().format(DateTimeFormatter.ofPattern("...."))

标签: java datetime-format datetime-parsing zoneddatetime


【解决方案1】:

日期时间格式

"dd.MM.yyyy HH:mm:ss.SSS"
不匹配
'2018-02-27T11:01:18.776+01:00[Europe/Berlin]'
pre> 由
ZonedDateTime.now().toString()
产生

【讨论】:

  • 我知道不是。我认为格式化程序用于将不匹配的输入格式化为所需的输出
  • 但是您尝试以不同的格式解析字符串。
  • ZonedDateTime.now().toString() 以默认格式生成日期字符串,之后您尝试使用不同的格式对其进行解析。
【解决方案2】:

这应该适用于转换 now() 结果String --> Date,因为正确的格式化程序已经在 J​​DK 中:

String inputStr = ZonedDateTime.now().toString();
ZonedDateTime parsed = ZonedDateTime.parse(inputStr, DateTimeFormatter.ISO_DATE_TIME) 


System.out.println(parsed);

如果您想另辟蹊径,请转换 日期 --> 字符串 via

 DateTimeFormatter pattern = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS");

        String parsed = pattern.format(ZonedDateTime.now());
        System.out.println(parsed);

【讨论】:

  • 它可以工作,但我不希望显示时区和偏移量。我想要我指定的格式。
【解决方案3】:

您可以直接使用 ZonedDateTime 的格式化功能。例如:

String dateString = ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);

你也可以看看:

【讨论】:

    【解决方案4】:

    要从 ZonedDateTime.toString() 返回解析结果,您根本不需要显式格式化程序:

        System.out.println(ZonedDateTime.parse(
                ZonedDateTime.now(ZoneId.of("Asia/Kuala_Lumpur")).toString()));
    

    这个打印出来的

    2018-02-27T21:48:16.214832+08:00[Asia/Kuala_Lumpur]

    您问题中的格式化程序非常适合格式化:

        System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Kuala_Lumpur"))
                .format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS")));
    

    这个打印出来的:

    27.02.2018 21:48:16.237

    你混淆了这个词的用法吗? 解析意味着分析一个字符串以便理解它,在这种情况下将它转换为一个日期时间对象,如ZonedDateTime。相反的转换称为formatting,将日期时间对象转换为特定格式的字符串,通常用于人类可读性或数据交换。

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2022-11-12
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2021-09-06
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多