首頁  >  文章  >  Java  >  為什麼 Java SimpleDateFormat 會將 AD 日期轉換為一月(yyyy/MM/DD 與 yyyy/MM/dd)?

為什麼 Java SimpleDateFormat 會將 AD 日期轉換為一月(yyyy/MM/DD 與 yyyy/MM/dd)?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-24 07:50:29949瀏覽

Why Does Java SimpleDateFormat Convert AD Dates to January (yyyy/MM/DD vs yyyy/MM/dd)?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn