簡體   English   中英

格式為“ MM / dd / yyyy HH:mm:ss a”的Java String to Date對象

[英]Java String to Date object of the format “MM/dd/yyyy HH:mm:ss a”

我需要將包含日期的String轉換為日期對象。

String的格式為"yyyy-mm-dd HH:mm:ss" ,我希望"MM/dd/yyyy HH:mm:ss a "格式。

String dateString = "2018-03-20 09:31:31";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss a", 
                                                           Locale.ENGLISH);

LocalDate date = LocalDate.parse(dateString , formatter);

上面的代碼引發異常。

您必須使用兩個Formatter ,一個將StringLocalDateTime ,另一個根據需要格式化該日期:

從String到LocalDateTime:

String dateString = "2018-03-20 09:31:31";

LocalDateTime date = LocalDateTime.parse(
        dateString,
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
);

現在從LocalDateTime到String:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
        "MM/dd/yyyy HH:mm:ss a", Locale.ENGLISH
);

String newDate = date.format(formatter);
System.out.println(newDate);// 03/20/2018 09:31:31 AM

注意:您必須使用LocalDateTime而不是LocalDate ,您的格式同時包含日期和時間,而不僅僅是日期,否則會出現錯誤:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay

基於對日期具有格式的誤解,這是一個常見的錯誤-但實際上卻沒有

日期/時間對象只有一個 ,這些值(通常是數字)代表日期(日歷中的特定點)和時間(一天中的特定時刻)的概念。

如果您有String ,那么您實際上沒有日期。 您有一個表示日期的文本 (字符序列)。 請注意,下面的所有字符串都是不同的(它們具有不同的字符序列),但是都表示相同的日期(相同的值,日歷中的相同點):

  • 2018-03-20 09:31:31
  • 03/20/2018 9:31:31 AM (使用美國的格式:月/日/年)
  • Tuesday, March 20th 2018, 09:31:31 am
  • 還有很多其他...

您想要做的就是獲取一種格式(一種String ,一種表示日期的文本),然后將其轉換為另一種格式(anoter String ,另一種代表相同日期的字符序列)。

在Java中(以及其他許多語言(如果不是全部),請使用btw),您必須分兩個步驟進行操作:

  1. String轉換為日期/時間對象(將文本轉換為數值)-這就是parse方法的作用
  2. 將日期/時間對象轉換為另一種格式(將數值轉換為另一種文本)

就是說,當您調用parse方法時,您正在嘗試將String (文本,字符序列)轉換為日期/時間對象。 這意味着DateTimeFormatter必須具有與輸入匹配的模式。

輸入的是2018-03-20 09:31:31 ,這是year-month-day hour:minute:second 您用來解析的格式化程序的格式為MM/dd/yyyy HH:mm:ss amonth/day/year hour:minute:second am/pm )。

您使用輸出模式(應該在步驟2中使用的模式)來解析輸入。 這就是為什么有一個例外:格式化程序試圖解析一個帶有2位數字的月份,后跟一個/當輸入實際上包含一個帶有4位數字的年份,然后是-

您必須為每個步驟使用不同的DateTimeFormatter ,並為每種情況使用正確的模式。 YCF_L的答案包含完成這項工作的代碼,我只想添加一個小細節。 用於輸出(第2步)的格式化程序為:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
        "MM/dd/yyyy HH:mm:ss a", Locale.ENGLISH
);

請注意, HH是使用HH 看一下javadoc ,您將看到大寫的HH代表一天中小時字段(值從0到23-因此將1 AM打印為01 ,將1 PM打印為13 )。

但是,您還需要打印AM / PM字段(模式中的a ),所以實際上您需要的是小寫字母hh ,即AM時鍾小時數 (值從1到12)或甚至KK每小時的小時 (值從0到11))。

String dateString = "2018-03-20 09:31:31";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
    Date date = formatter.parse(dateInString);

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    String reportDate = df.format(date );
} catch (ParseException e) {
        e.printStackTrace();
}

您需要執行兩步轉換:

  1. 格式錯誤的字符串日期時間到(臨時)LocalDateTime對象。
  2. 如果您仍然只想提取日期(年月日),請執行LocalDateTime.toLocalDate()
  3. 正確的格式從此LocalDateTime對象轉換為您的String對象

      String dateString = "2018-03-20 09:31:31"; DateTimeFormatter formatterForWrongFormat = new DateTimeFormatterBuilder() .append(DateTimeFormatter.ISO_LOCAL_DATE) .appendLiteral(" ") .append(DateTimeFormatter.ISO_LOCAL_TIME) .toFormatter(); //1- from String(wrong format) into datetime object LocalDateTime dateTime = LocalDateTime.parse(dateString , formatterForWrongFormat); // 1.1 extract date object (Optional) LocalDate myDate = dateTime.toLocalDate(); // 2- now from your LocalDateTime to the String in the RIGHT format DateTimeFormatter formatterForRightFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss a", Locale.ENGLISH); System.out.println("right format: "+dateTime.format(formatterForRightFormat)); 

您可以在這里測試此代碼

您可以使用SimpleDateFormatter,它更易於實現,並允許您輕松更改日期格式。

更多信息: SimpleDateFormat類提供哪些日期格式?

希望這個能對您有所幫助 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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