java - 美国/马萨特兰时区无法解析的日期

标签 java date timezone simpledateformat

我在 America/Los_Angeles TZ 上,当我尝试在 America/Mazatlan TZ 中渲染午夜时,出现以下异常:

Exception in thread "main" java.text.ParseException: Unparseable date: "12:00 AM"

这是我重现此代码的代码:

    DateFormat dateFormat = new SimpleDateFormat("h:mm a");
    TimeZone timeZone = TimeZone.getTimeZone("America/Mazatlan");
    dateFormat.setTimeZone(timeZone);
    dateFormat.setLenient(false);
    Date parse = dateFormat.parse("12:00 AM");

我知道注释掉 setLenient(false) 会解决这个问题,我只是不确定为什么这是一个修复,因为其他时区具有相同的偏移量,例如 America/Inuvik 不会引起这样的问题。

任何帮助都会很棒。

最佳答案

当您不指定日期时,将使用 1970-01-01。

time zone definition for Mazatlan显示基准偏移量在 1970 年从 -08:00 切换到 -07:00。这造成了本地时间的不连续性,类似于通常在 spring-forward daylight saving time transition 期间发现的那种.

从午夜到凌晨 1:00 之间缺少一个小时的本地时间。此范围内的时间无效。假设区域定义是正确的,这意味着时钟像这样向前滴答:

======== UTC =======     ==== America/Mazatlan ===
1970-01-01T07:59:57Z     1969-12-31T23:59:57-08:00
1970-01-01T07:59:58Z     1969-12-31T23:59:58-08:00
1970-01-01T07:59:59Z     1969-12-31T23:59:59-08:00   
1970-01-01T08:00:00Z     1970-01-01T01:00:00-07:00  (transition!)
1970-01-01T08:00:01Z     1970-01-01T01:00:01-07:00
1970-01-01T08:00:02Z     1970-01-01T01:00:02-07:00

因此,如果您使用 SimpleDateFormat - 您应该包含日期,而不仅仅是时间。

关于java - 美国/马萨特兰时区无法解析的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302793/

相关文章:

java - 停止java中继承树中某些类类型的序列化

java - Jackson 将 Map 合并到 json 对象中

javascript - 坚持在 JavaScript 中递增日期

c# - DateTimeOffset 解析和自定义时区

mysql - 将所有记录从 UTC 更新为 EST 时区 + mysql

mysql - 如何将 mysql 时区从 EDT 时间更改为 UTC

java - 如何显示启动画面,在后台加载数据,然后隐藏启动画面?

java - 带有可选查询字符串的 Spring RESTful url

java - Java 日期解析代码有什么问题?

javascript - 法语日期无效