gpt4 book ai didi

java - 在我的程序中,在执行 SimpleDateFormat.parse 时间歇性地出现 ParseException

转载 作者:行者123 更新时间:2023-11-30 06:04:39 25 4
gpt4 key购买 nike

在我的程序中,我在执行 SimpleDateFormat.parse 时间歇性地遇到 ParseException

我编写了一个 apache Storm Bolt,其中我正在解析输入日期“2018-02-26 18:13:32 UTC”

并非每个输入日期都会引发此异常。另外,我已在错误日志中打印了输入日期。从视觉上看,输入日期格式没有问题。

但是我遇到了间歇性输入的ParseException

我怀疑是因为它是并发环境。

以下是代码片段:

utcDateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss 'UTC'");

最佳答案

I doubt is that because it is concurrent environment.

实际上,这是最可能的原因,因为 SimpleDateFormat 不是线程安全的。请在此处查看问题分析以及解决方法:https://www.javaspecialists.eu/archive/Issue172.html

除此之外,“UTC”是一个重要信息(它表明日期采用 UTC 格式),因此您不能将其视为文字(引号内)。您创建的格式化程序忽略了 UTC 日期(因为引号内的它被视为“某些文本”,而不是“它采用 UTC”),所以它实际上是使用 JVM 默认时区(不一定是 UTC)。

要正确解析 UTC,您必须使用 z 模式:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date date = sdf.parse("2018-02-26 18:13:32 UTC");

但如果您使用的是 Java 8 或更高版本,只需使用新的日期 API:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// parse date and time
.appendPattern("yyyy-MM-dd HH:mm:ss ")
// parse UTC
.appendOffset("+HH:MM", "UTC")
// create the formatter
.toFormatter();
OffsetDateTime odt = OffsetDateTime.parse("2018-02-26 18:13:32 UTC", fmt);

乍一看似乎更复杂,但这个新 API 提供了许多不同的日期时间类型以及更多解析和格式化它们的选项。

更重要的是:它是线程安全的

更新:

根据评论中的建议,您还可以执行以下操作:

DateTimeFormatter fmt  = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzz");
ZonedDateTime zdt = ZonedDateTime.parse("2018-02-26 18:13:32 UTC", fmt);

如果您仍然需要使用java.util.Date,则很容易转换:

Date javaUtilDate = Date.from(zdt.toInstant());

OffsetDateTime 类还有一个 toInstant() 方法,因此两者都可以转换为 Date

关于java - 在我的程序中,在执行 SimpleDateFormat.parse 时间歇性地出现 ParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029605/

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