DateTimeParseException:无法解析文本'2019-06-07 12:18:16'

问题描述

在一天中的小时内使用HH代替hh

您要问的问题是hh(两次)在格式模式字符串中使用小写字母。您需要HH从00到23的小时中的大写字母,hh是从01到12的AM或PM中的小时数。因此出了问题,java.time不知道12您的字符串中是12 AM还是12 PM并拒绝为您猜测。

如果您仔细阅读异常消息,您还会注意到该异常消息已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

这是 错的 !我在世界标准时间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代替。

在此问题及其答案中hh,有更多有关使用HHkk用于格式化和解析小时值的信息:SimpleDateFormat上的java HH:mm和hh:mm之间的区别。问题是问的出了名的麻烦SimpleDateFormat,但答案也同样有效DateTimeFormatter

解决方法

我有以下代码将Instant转换为String,然后将其转换回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

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

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”