您需要确定时区(或至少确定偏移量,但时区通常是正确的方法)。然后你需要使用一个格式化程序来定义你试图解析的格式:
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter(Locale.ROOT);
使用此格式化程序,这是一个非常简单的操作:
ZoneId zone = ZoneId.of("Asia/Kolkata");
String input = "2021-07-13 05:22:18.712";
OffsetDateTime dateTime = LocalDateTime.parse(input, FORMATTER)
.atZone(zone)
.toOffsetDateTime();
System.out.println(dateTime);
示例代码段的输出是:
2021-07-13T05:22:18.712+05:30
由于@Sweeper 在评论中指出,您的字符串不包含 UTC 偏移量或时区,因此将其解析为LocalDateTime
第一个。在Local
一些 java.time 类名中意味着没有时区或 UTC 偏移量。然后在预期的时区转换为 aZonedDateTime
并进一步转换为所需的类型,OffsetDateTime
.
如果要使用 JVM 的默认时区,请设置zone
为ZoneId.systemDefault()
. 请注意,默认时区可能随时从您程序的另一部分或在同一 JVM 中运行的另一个程序更改,因此这是脆弱的。
可能的捷径
我的格式化程序很罗嗦,因为我想尽可能多地重用内置格式化程序。如果您不介意从模式中手动构建格式化程序,您可以使用:
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS", Locale.ROOT);
或者更短,您可以手动将字符串中的空格替换为 aT
以获得 ISO 8601 格式,然后解析为 aLocalDateTime
而无需指定任何格式化程序。
你的代码出了什么问题?
您收到的异常消息试图提供帮助:
但我不断收到此错误 - org.threeten.bp.format.DateTimeParseException: Text '2021-07-13 05:22:18.712' could not be parsed at index 10.
字符串中的索引 10 是日期和时间之间的空格。one-argOffsetDateTime.parse
方法需要 ISO 8601 格式,例如2021-07-13T05:22:18.712+05:30
,所以用 aT
表示时间部分的开始,最后用 UTC 偏移量。没有T
导致你的异常。如果您解决了这个问题,由于缺少 UTC 偏移量,您会遇到另一个异常。
关联
维基百科文章:ISO 8601