簡體   English   中英

為什么Java的SimpleDateFormat會解析這個問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM