[英]Why Does Java's SimpleDateFormat parse this
嗨,我有一個簡單的日期格式設置自定義格式字符串:MMddyy
我給它以下值來解析:4 1 01
我不認為它應該解析這個因為空格,但簡單日期格式返回日期
4月4日0001AD
任何想法為什么?
這是預期的行為 - 你告訴DateFormat對象期望一個6字符的字符串表示日期,這是你傳入的。空格被解析好。 但是,如果您使用“4x1x01”,則會出現錯誤。 請注意,解析時,leniency默認為true,例如
DateFormat df = new SimpleDateFormat("MMddyy");
Date date = df.parse("4 1 01"); // runs successfully (as you know)
DateFormat df = new SimpleDateFormat("MMddyy");
Date date = df.parse("41 01"); // 5 character String - runs successfully
DateFormat df = new SimpleDateFormat("MMddyy");
df.setLenient(false);
Date date = df.parse("41 01"); // 5 character String - causes exception
DateFormat df = new SimpleDateFormat("MMddyy");
Date date = df.parse("999999"); // 6 character String - runs successfully
DateFormat df = new SimpleDateFormat("MMddyy");
df.setLenient(false);
Date date = df.parse("999999"); // 6 character String - causes exception
當leniency設置為true(默認行為)時,解析會嘗試解密無效輸入,例如31天月份的第35天成為下個月的第4天。
用於解析模式的大小(重復字符的數量)不是相應文本的預期大小。 從javadoc,針對不同的相關表示類型:
- Number :對於解析, 忽略模式字母的數量,除非需要分隔兩個相鄰的字段。
- 年份 :在解析過程中,只有正好兩位數的字符串才會被解析為默認世紀。 字面上解釋任何其他數字字符串,例如一位數字符串,三位或更多位數字符串,或不是所有數字的兩位數字符串(例如,“ - 1”)。 所以使用相同的模式解析“01/02/3”或“01/02/003”
- 月份 :如果模式字母的數量為3或更多,則將月份解釋為文本; 否則,它被解釋為一個數字。
空格導致解析器停止解析實際字段 (尾隨空格對數字無效)並從下一個開始。 由於模式在這兩個字段之間沒有空格,因此不會消耗它並且是第二個字段的一部分(前導空格有效)。 因此,得到的年份不是“正好兩位數”,並且不會被解析為默認世紀。
解析測試( lenient
設置為false
):
FORMAT TEXT RESULT (ISO yyyy-MM-dd)
-------------------------------------------------
dddyy 01011 2011-01-10
dddyy 10 11 0011-01-10 (year is 3 chars: " 11")
dddyy 10 1 0001-01-10 (year is 2 char but not 2 digits: " 1")
dddy 01011 2011-01-10 ("y" same as "yy")
dd yy 10 11 2011-01-10 (ok, whitespace is consumed, year: "11")
d/y 3/4 0004-01-03 (year is not 2 digits)
d/y 3/04 2004-01-03
M/d/y 4/6/11 2011-04-06
2位數的年份是模糊的 - 因此它假定為0001 - 第一年將在01結束。你能轉換成4位數 - 可能使用字符串操作?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.