[英]Java String to Date object of the format “yyyy-mm-dd HH:mm:ss.SSSS”
[英]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
,一個將String
為LocalDateTime
,另一個根據需要格式化該日期:
從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),您必須分兩個步驟進行操作:
String
轉換為日期/時間對象(將文本轉換為數值)-這就是parse
方法的作用 就是說,當您調用parse
方法時,您正在嘗試將String
(文本,字符序列)轉換為日期/時間對象。 這意味着DateTimeFormatter
必須具有與輸入匹配的模式。
輸入的是2018-03-20 09:31:31
,這是year-month-day hour:minute:second
。 您用來解析的格式化程序的格式為MM/dd/yyyy HH:mm:ss a
( month/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();
}
您需要執行兩步轉換:
LocalDateTime.toLocalDate()
以正確的格式從此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));
您可以在這里測試此代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.