Java SimpleDateFormat 難題:所有月份預設為一月
使用Java 的SimpleDateFormat 從Active Directory 解析日期時,出現了一個令人解析日期時,出現了一個令人解析費解的問題:每個單獨的日期日期被錯誤地轉換為一月。出於對這種差異的好奇,讓我們深入研究一下說明問題的程式碼片段:
<code class="java">private Date getParsedDate(String givenString) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/DD"); try { return sdf.parse(formattedString); } catch (ParseException ex) { ex.printStackTrace(); } return null; }</code>
在使用AD 日期值「20050912190509.0Z」執行此程式碼時,我們獲得了意外的輸出:
Value from AD is: 20050912190509.0Z Formatted String is: 2005/09/12 Final date string is: Wed Jan 12 00:00:00 EST 2005
雖然準確識別了日期和年份,但月份始終被誤認為是一月。這個看似簡單的程式碼中到底隱藏著什麼秘密,卻導致了這個明顯的錯誤?
答案在於 SimpleDateFormat 模式字串中的微妙疏忽。透過指定“yyyy/MM/DD”,我們無意中強制月份格式為大寫字母“MM”。但是,Active Directory 日期值使用小寫「mm」表示月份。
要解決此問題,我們只需將模式字串調整為“yyyy/MM/dd”,小寫“dd”表示天:
<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");</code>
透過進行此細微修改, SimpleDateFormat 可以正確解釋Active Directory 中的日期,並使用正確的月份呈現最終日期字串:
Value from AD is: 20050912190509.0Z Formatted String is: 2005/09/12 Final date string is: Wed Sep 12 00:00:00 EST 2005
此更正可確保Java 的SimpleDateFormat 準確解析來自Active Directory 的日期,使您能夠自信地處理歷史資料或根據特定日期範圍建立報表。
以上是為什麼 Java SimpleDateFormat 會將 AD 日期轉換為一月(yyyy/MM/DD 與 yyyy/MM/dd)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!