我必须从字符串中获取 OffsetDateTime
I have to get OffsetDateTime from a string
字符串的格式为 - "2021-07-13 05:22:18.712"
我尝试使用这段代码来解析它。
OffsetDateTime parsedDateTime = OffsetDateTime.parse("2021-07-13 05:22:18.712");
但我一直收到这个错误 -
org.threeten.bp.format.DateTimeParseException:无法在索引 10 处解析文本“2021-07-13 05:22:18.712”。
我如何让它发挥作用?任何建议都会有所帮助。谢谢
您需要确定时区(或至少确定偏移量,但时区通常是正确的方法)。然后你需要使用一个格式化程序来定义你要解析的格式:
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
。某些 java.time class 名称中的 Local
表示 没有时区或 UTC 偏移量 。然后在预期的时区转换为 ZonedDateTime
并进一步转换为所需的类型,OffsetDateTime
.
如果要使用JVM的默认时区,请将zone
设置为ZoneId.systemDefault()
。请注意,默认时区可能会随时从程序的另一部分或同一 JVM 中的另一个程序 运行 更改,因此这是脆弱的。
可能的捷径
我的格式化程序很冗长,因为我想尽可能多地重用内置格式化程序。如果您不介意根据模式手动构建格式化程序,您可以使用:
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS", Locale.ROOT);
或者更短,您可以用 T
手动替换字符串中的 space 以获得 ISO 8601 格式,然后解析为 LocalDateTime
而根本不指定任何格式化程序.
你的代码出了什么问题?
您收到的异常消息正在努力提供帮助:
But i keep getting this error -
org.threeten.bp.format.DateTimeParseException: Text '2021-07-13
05:22:18.712' could not be parsed at index 10.
字符串中的索引 10 是日期和时间之间的 space 所在的位置。一个参数 OffsetDateTime.parse
方法需要 ISO 8601 格式,如 2021-07-13T05:22:18.712+05:30
,因此使用 T
表示时间部分的开始,并在结束时使用 UTC 偏移量。 T
的缺失导致了您的异常。如果你修复了这个问题,你会因为缺少 UTC 偏移而得到另一个异常。
Link
您首先需要检查document。
表示解析需要使用日期格式,例如 2007-12-03T10:15:30 +01:00.
您的日期缺少“T”、“2021-07-13 05:22:18.712”。因此它并不顺利,从索引 0 开始计算,它的字符在 10.
如果需要解析2021-07-13T05:22:18.712,还是会报错。错误 Text '2021-07-13T05:22:18.712' could not be parsed at index 23. 这是毫秒的问题。
还有一大轮要走:
//Format to date
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//Format to new string
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
java.util.Date date1=simpleDateFormat.parse("2021-07-13 05:22:18.712");
String newDate = formatter.format(date1);
//finally.
OffsetDateTime parsedDateTime = OffsetDateTime.parse(newDate);
字符串的格式为 - "2021-07-13 05:22:18.712"
我尝试使用这段代码来解析它。
OffsetDateTime parsedDateTime = OffsetDateTime.parse("2021-07-13 05:22:18.712");
但我一直收到这个错误 - org.threeten.bp.format.DateTimeParseException:无法在索引 10 处解析文本“2021-07-13 05:22:18.712”。
我如何让它发挥作用?任何建议都会有所帮助。谢谢
您需要确定时区(或至少确定偏移量,但时区通常是正确的方法)。然后你需要使用一个格式化程序来定义你要解析的格式:
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
。某些 java.time class 名称中的 Local
表示 没有时区或 UTC 偏移量 。然后在预期的时区转换为 ZonedDateTime
并进一步转换为所需的类型,OffsetDateTime
.
如果要使用JVM的默认时区,请将zone
设置为ZoneId.systemDefault()
。请注意,默认时区可能会随时从程序的另一部分或同一 JVM 中的另一个程序 运行 更改,因此这是脆弱的。
可能的捷径
我的格式化程序很冗长,因为我想尽可能多地重用内置格式化程序。如果您不介意根据模式手动构建格式化程序,您可以使用:
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS", Locale.ROOT);
或者更短,您可以用 T
手动替换字符串中的 space 以获得 ISO 8601 格式,然后解析为 LocalDateTime
而根本不指定任何格式化程序.
你的代码出了什么问题?
您收到的异常消息正在努力提供帮助:
But i keep getting this error - org.threeten.bp.format.DateTimeParseException: Text '2021-07-13 05:22:18.712' could not be parsed at index 10.
字符串中的索引 10 是日期和时间之间的 space 所在的位置。一个参数 OffsetDateTime.parse
方法需要 ISO 8601 格式,如 2021-07-13T05:22:18.712+05:30
,因此使用 T
表示时间部分的开始,并在结束时使用 UTC 偏移量。 T
的缺失导致了您的异常。如果你修复了这个问题,你会因为缺少 UTC 偏移而得到另一个异常。
Link
您首先需要检查document。
表示解析需要使用日期格式,例如 2007-12-03T10:15:30 +01:00.
您的日期缺少“T”、“2021-07-13 05:22:18.712”。因此它并不顺利,从索引 0 开始计算,它的字符在 10.
如果需要解析2021-07-13T05:22:18.712,还是会报错。错误 Text '2021-07-13T05:22:18.712' could not be parsed at index 23. 这是毫秒的问题。
还有一大轮要走:
//Format to date
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//Format to new string
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
java.util.Date date1=simpleDateFormat.parse("2021-07-13 05:22:18.712");
String newDate = formatter.format(date1);
//finally.
OffsetDateTime parsedDateTime = OffsetDateTime.parse(newDate);