有人能帮忙吗?
public void dateCalender() throws ParseException{
System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("120/12/2013").toString()); //OUTPUT (Unexpected): Mon Dec 12 00:00:00 IST 2022
System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("23/12/2013").toString()); //OUTPUT (Unexpected): Wed Nov 12 00:00:00 IST 2014
System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("Jan/12/2013").toString()); //OUTPUT (Expected): Unparseable date: "Jan/12/2013"
}
6条答案
按热度按时间mcvgt66p1#
必须使用false调用
setLenient
-否则SimpleDateFormat
将试图“找出”月份,因此,首先创建SimpleDateFormat
并调用sdf.setLenient(false)
,现在解析时将得到异常。vmjh9lq92#
根据文档**,解析是宽松的**,因此您没有收到无效输入的异常。它已转换为另一个值。
默认情况下,解析是宽松的:如果输入不是该对象的format方法使用的格式,但仍然可以解析为日期,则解析成功。客户端可以通过调用setLenient(false)来坚持严格遵守格式。
如果你想得到
java.text.ParseException: Unparseable date:
,那么在SimpleDateFormat
处应用setLenient(false);
k4emjkb13#
来自文档:
您需要将格式设置为非宽松。
xmd2e60i4#
关于前两项:
编译器会将其视为'12/12/2013 + 118 months',并从本质上求解出正确的日期。在您的示例中,结果为December 12,2022(12/12/2013 + 9 years)。
同样的事情也会发生。你会得到“12/12/2013 + 9个月”,或者11/12/2014。
第三种格式不是MM/dd/yyyy格式,从其他答案中可以看出,你可以这样做:
jhkqcmku5#
* Java时间 *
Question和accepted answer使用
java.util
日期时间API及其格式化APISimpleDateFormat
,这在2013年是正确的做法。2014年3月,modern Date-Time API取代了传统的日期时间API,从那时起,强烈建议切换到现代日期时间APIjava.time
。java.time
(现代日期-时间API)的解决方案:**java.time
非常聪明,无需任何显式设置即可捕获大多数此类问题。自定义的DateTimeFormatter
默认设置为ResolverStyle#SMART
,它不允许月份超出1 - 12的范围,也不允许日期值超过31。但是,也就是说02/31/2022
可以用DateTimeFormatter.ofPattern("MM/dd/uuuu")
解析为2022-02-28
,只是不允许这样的解析,需要设置ResolverStyle.#STRICT
。ONLINE DEMO
ResolverStyle.#STRICT
的演示**:ONLINE DEMO
y
代替u
,但是可以使用I preferu
到y
。从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
kq4fsx7k6#
您使用的格式是MM/dd/yyyy,因此它有两个位置
你试试这样:
系统.输出.打印输入(新的简单日期格式(“年/月/日”,区域设置.英语).解析(“2013年1月12日”).toString());
这里不会抛出无法解析的异常,但我不担心它是否有效
我认为每次只使用MM/DD/YYYY格式作为“1/12/2013”时,这将是错误的方式