gpt4 book ai didi

java - 巴西 DST 期间的日期解析异常

转载 作者:行者123 更新时间:2023-12-01 06:13:31 27 4
gpt4 key购买 nike

进入巴西夏令时时间段时,时钟向前拨快 1 小时。 2014 年,夏令时于 19/10 开始,因此时间 19/10/2014 00:00:00 变为 19/10/2015 01:00:00。 “不存在”之间的句点。

因此,当使用时区 America/Sao_Paulo 解析日期“19/10/2014 00:45:00”时,会抛出解析异常: java.text.ParseException: Unparseable date: "19/10/2014 年 00:45:00"。

String date = "19/10/2014 00:59:00";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
sdf.setLenient(false);
sdf.setTimeZone("America/Sao_Paulo");

Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
calendar.setTime(sdf.parse(date));

美国/圣保罗时区据说支持 DST 更改。此问题的预期解决方案是什么?当 DST 周期开始和结束时,我必须手动更改 jvm 时区吗?目前,“修复”是在 DST 周期开始时将 jvm 时区更改为 GMT-2。

注意:此问题源于使用 spring 开发的应用程序。示例日期在从字符串转换为 java.util.Calendar 时抛出异常。在上面的示例代码中,我将 lenient 设置为 false,以便能够重现该错误。

最佳答案

java.util.Calendar 表示时间的一个瞬间。那一刻必须存在。当本地时间值落入向前的 DST 间隙时,这些值无法表示为真实的瞬时时间。换句话说,巴西正确配置的时钟永远不会在 2014 年 10 月 19 日显示 00:45:00。因此异常(exception)。请参阅the DST tag wiki用于视觉表示。

由于您正在解析用户输入,因此我建议将字符串解析为 LocalDateTime 而不是 Calendar。对于 Java 7,您可以从 Joda-Time 获取此信息。对于 Java 8,这是内置于新的 java.time 中的。包。

将其作为 LocalDateTime 后,您就可以决定从那里开始。如果时间无效(落入前向过渡的间隙)或不明确(由于后退过渡),您可以检测这些情况并决定如何在应用程序中处理它们。

关于java - 巴西 DST 期间的日期解析异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30083568/

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