无法解释的日期在美国/马萨特兰时区

时间:2014-12-04 19:50:46

标签: 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不会导致像这样的问题。

任何帮助都会很棒。

3 个答案:

答案 0 :(得分:3)

如果您未指定日期,则使用1970-01-01。

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

从午夜到凌晨1点之间有一个小时的当地时间丢失。此范围内的时间无效。假设区域定义正确,这意味着时钟向前勾选:

======== 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 - 您应该包含日期,而不仅仅是时间。

答案 1 :(得分:1)

如果删除该行,

    dateFormat.setLenient(false);

您的解析对象值正在变为

     Thu Jan 01 10:00:00 EET 1970

我不知道为什么,但America/Mazatlan TZ此行正在创建例外。

对于America/Los_Angeles TZAmerica/Inuvik TZ,使用dateFormat.setLenient(false)行没有给出任何错误和结果与America/Mazatlan TZ相同。

    Thu Jan 01 10:00:00 EET 1970

答案 2 :(得分:-1)

因为你dateFormat.setLenient(false);和12:00应该是'PM'而不是'AM'