【问题标题】:java.text.ParseException: Unparseable date: "1991-04-14 00:00:00"java.text.ParseException:无法解析的日期:“1991-04-14 00:00:00”
【发布时间】:2017-12-21 08:23:52
【问题描述】:

当我将宽松模式设置为 false 时,出现异常:“java.text.ParseException: Unparseable date:”1991-04-14 00:00:00“”。 代码如下:`

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    format.setLenient(false);
    System.out.println(format.parse("1991-04-14 00:00:00"));

当我将宽松模式设置为 true 时,结果显示:“Sun Apr 14 01:00:00 CDT 1991”。 按权利,它应该是“Sun Apr 14 00:00:00 CDT 1991”。

下面的日期也有这个问题。

  • 19400603000000
  • 19410316000000
  • 19860504000000
  • 19870412000000
  • 19880410000000
  • 19890416000000
  • 19900415000000
  • 19910414000000

【问题讨论】:

  • 我得到了时区:sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
  • 我会考虑夏令时;夏季时间的开始。这可以解释 1 小时的差异;跳跃一小时的一秒。
  • 顺便说一句,您为什么要使用早已过时且臭名昭著的麻烦 SimpleDateFormat 类? java.time, the modern Java date and time API,使用起来非常好(幸运的是,它可以引入您所在时区不存在的时间)。
  • timeanddate.com/time/zone/china/shanghai。尝试在“时区更改”框中选择 1925 – 1949、1980 – 1989 和 1990 – 1999。

标签: java simpledateformat


【解决方案1】:

问题中的大多数日期都发生在春季。它们可能发生在您正在使用的时区过渡到每日节省时间时。

format.parse("1991-04-14 00:00:00")

失败可能是因为您使用的时区在1991-04-14 00:00:00 转换为每日节省时间,这意味着没有有效的1991-04-14 00:00:00 日期,而是时间向前跳了一小时,直接到1991-04-14 01:00:00 .

正如我所怀疑的,这是 1991 年中国的时变:

1991 年 4 月 14 日 - 夏令时开始

当地标准时间即将到来时
1991 年 4 月 14 日,星期日,00:00:00 时钟拨快 1 小时到
改为 1991 年 4 月 14 日星期日 01:00:00 当地时间。

(Source)

因此1991-04-14 00:00:00在中国从来都不是有效时间。

您可以使用提供的链接搜索其他无效日期。只需更改 URL 中的年份即可。

【讨论】:

    【解决方案2】:

    如果我执行你给定的代码,我没有问题,我得到以下结果:

    Sun Apr 14 00:00:00 CEST 1991
    

    所以问题可能与您的时区有关?

    【讨论】:

    • 我得到了时区:sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
    • 你可以尝试添加这一行:format.setTimeZone(TimeZone.getTimeZone("GMT+2"));
    • 拜托,Are “Your code works fine for me” answers acceptable? 不如将此作为评论发布,这也意味着您将不得不省略图片。
    • 这对我不起作用!它打印:Sun Apr 14 07:00:00 CDT 1991
    • 我不太明白这是不是一个好主意,但你可以试试这个:format.setTimeZone(TimeZone.getTimeZone("GMT-5"));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多