我在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。
马萨特兰的时区定义显示,基本偏移量在 1970 年从 -08:00 切换到 -07:00。 这会导致本地时间的不连续性,类似于在春季前向夏令时转换期间通常发现的那种。
有一个小时的当地时间缺失,从午夜到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
- 您应该包括日期,而不仅仅是时间。
如果删除该行,
dateFormat.setLenient(false);
您的解析对象值正在成为
Thu Jan 01 10:00:00 EET 1970
我不知道为什么,但对于America/Mazatlan TZ
来说,这条线正在创造异常。
对于America/Los_Angeles TZ
和America/Inuvik TZ
,dateFormat.setLenient(false)
行的使用不会给出任何错误,结果与America/Mazatlan TZ
相同。
Thu Jan 01 10:00:00 EET 1970
因为你dateFormat.setLenient(false);
和12:00应该是"PM"而不是"AM"