【发布时间】:2016-09-05 12:05:30
【问题描述】:
我使用SimpleDateFormat 将字符串解析为Date 对象,我想知道为什么结果不是我所期望的。
例如:
DateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
Date date = yyyyMMdd.parse("20100725");
System.out.println(date);
按预期工作并输出
Sun Jul 25 00:00:00 CEST 2010
但是
Date date = yyyyMMdd.parse("2010-07-25");
System.out.println(date);
也可以工作和输出
Mon Dec 07 00:00:00 CET 2009
我期待ParseException,但似乎SimpleDateFormat 将月份部分-07 和日期部分-25 解释为负数。首先,我不知道 12 月 7 日是怎么来的。所以我尝试了另一个值:
Date date = yyyyMMdd.parse("2010-7-25");
System.out.println(date);
它超过了
Sun Apr 05 00:00:00 CEST 2009
所以它似乎以某种方式从年份 2010 中减去了 7 月,这应该是 5 月 1 日,而 25 天,所以结果是 2009 年 4 月 5 日。
您在服务实现中使用模式yyyyMMdd 并且某些客户端意外将日期发送为yyyy-MM-dd 的图像。你不会得到例外。相反,您将获得完全不同的日期。我想这不是你所期望的。
例如
String clientData = "2010-05-23";
DateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
Date parsedDate = yyyyMMdd.parse(clientData);
System.out.println("Client : " + clientData);
System.out.println("Service : " + yyyyMMdd.format(parsedDate));
我错过了什么吗?
如何防止 SimpleDateFormat 解析“错误”日期?
当然可以先用正则表达式检查,但是有更好的方法吗?
【问题讨论】:
-
你试过用
setLenient(false)吗? -
不,我没有。谢谢。至少它是如此简单。但我仍然想知道为什么默认启用 lenient 。因为它可能导致误解和后期错误。
-
这个问题你要问Java的设计者;)
-
我必须承认我以前从未使用过
setLenient,但我想我会更频繁地使用它。 :) -
@RenéLink 这很容易被遗忘(这就是为什么它默认开启特别令人发指的原因)。我刚刚检查了我们的代码库,但我并不满意。
标签: java date simpledateformat