gpt4 book ai didi

Java 最快的 OffsetDateTime 解析器

转载 作者:行者123 更新时间:2023-11-29 04:12:01 24 4
gpt4 key购买 nike

在 Java 中将日期/时间解析为 OffsetDateTime 的最快方法是什么?有比标准库更快的库吗?

n.e.g.

OffsetDatetime x = Something.parse("2018-01-02T12:34:56+00:00");

最佳答案

据我所知,答案是否定的,没有其他库可以将 2018-01-02T12:34:56+00:00"(ISO 8601 格式)等字符串解析为OffsetDateTime 对象。如果存在的话,我本以为会听说或读到它。

我对下一点感到如履薄冰,但我也觉得标准库(又名 java.time)足够高效,而且速度可能与您预期的一样快。

编辑:我很好奇并编写了自己的解析方法,看看我是否能够胜过单参数 OffsetDateTime.parse。我曾是。我自己的方法(下面的源代码)没有内置方法的灵 active ,它只接受标准格式的大量变体中的一个,这可能是它在性能方面的强项。解析你的字符串一百万次花费了:

  • 1.034 秒使用 OffsetDateTime.parse
  • 0.117 秒使用我自己的方法

这不是推荐!我可能永远不会使用我自己的方法。对于绝大多数目的来说,维护负担是不值得的。如果有一天出现了 ISO 8601 的不同变体,您将遇到代价高昂的支持问题和错误修复。

我的方法很简单:

private static final OffsetDateTime parse(String s) {
char offsetSign;
if (s.length() != 25
|| s.charAt(4) != '-'
|| s.charAt(7) != '-'
|| s.charAt(10) != 'T'
|| s.charAt(13) != ':'
|| s.charAt(16) != ':'
|| ((offsetSign = s.charAt(19)) != '+' && offsetSign != '-')
|| s.charAt(22) != ':') {
throw new IllegalArgumentException();
}
int offsetHours = Integer.parseInt(s.substring(20, 22));
int offsetMinutes = Integer.parseInt(s.substring(23, 25));
if (offsetSign == '-') {
offsetHours = -offsetHours;
offsetMinutes = -offsetMinutes;
}
return OffsetDateTime.of(Integer.parseInt(s.substring(0, 4)),
Integer.parseInt(s.substring(5, 7)),
Integer.parseInt(s.substring(8, 10)),
Integer.parseInt(s.substring(11, 13)),
Integer.parseInt(s.substring(14, 16)),
Integer.parseInt(s.substring(17, 19)),
0,
ZoneOffset.ofHoursMinutes(offsetHours, offsetMinutes));
}

我知道代码中存在错误。我认为不值得为此答案进行彻底测试和修复错误,因为它不太可能对性能产生太大影响。

关于Java 最快的 OffsetDateTime 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com