当前位置: 首页 > 知识库问答 >
问题:

DateTimeParseException:无法分析文本“2019-06-07 12:18:16”

凤经国
2023-03-14

我有以下代码将即时转换为字符串,然后将其转换回I

String timestampString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));
LOGGER.info("timestampString: " + timestampString);

Instant instant =
    LocalDateTime.parse(timestampString,
        DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")).toInstant(ZoneOffset.UTC);

它将timestampString打印为:2019-06-07 12:45:57

在分析字符串时失败:

java.time.format.DateTimeParseException: Text '2019-06-07 12:45:57' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MinuteOfHour=45, HourOfAmPm=0, NanoOfSecond=0, SecondOfMinute=57, MilliOfSecond=0, MicroOfSecond=0},ISO resolved to 2019-06-07 of type java.time.format.Parsed

为什么即使它与我将时间戳转换为的格式相同,它也无法解析它?

共有1个答案

司马璞
2023-03-14

您要问的问题是,您在格式模式字符串中使用了小写的hh(两次都是)。从00到23小时的工作日需要大写字母HHhh表示从01到12的上午或下午的小时。所以出问题的是java。时间不知道你的字符串中的12指的是上午12点还是下午12点,并拒绝为你猜测。

如果仔细阅读异常消息,您也会注意到它说,HourOfAmPm=0已被解析。它没有说HourOfDay

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String timestampString = LocalDateTime.now().format(formatter);
    System.out.println("timestampString: " + timestampString);

    Instant instant = LocalDateTime.parse(timestampString, formatter)
            .toInstant(ZoneOffset.UTC);

    System.out.println("instant: " + instant);

当我刚刚运行这个片段时,我得到了以下输出:

timestampString: 2019-06-08 19:22:51
instant: 2019-06-08T19:22:51Z

这是错误的!我在UTC 17:22左右运行了片段,而不是19:22。由于丹麦仍在使用夏季时间(该死),因此这里的当地时间是19:22,用于结果并转换为UTC中相同的挂钟时间,而不是相同的即时时间。您应该始终将您想要的时区传递给now方法以避免此类错误。既然您想要UTC:

    String timestampString = LocalDateTime.now(ZoneOffset.UTC).format(formatter);
timestampString: 2019-06-08 17:27:57
instant: 2019-06-08T17:27:57Z

更好的是,不要使用LocalDateTime来保存您想用作时间时刻的东西。改用InstantOffsetDateTimeZonedDateTime

关于使用hhhhkk格式化和解析这个问题及其答案中的小时值,有更多信息:SimpleDataFormat上java hh:mm和hh:mm之间的差异。问题是关于臭名昭著的麻烦的SimpleDateFormat,但答案对DateTimeFormatter也有效。

 类似资料: