格式的棘手的部分是處理序數(如22nd
),即處理的權利後綴。沒有內置模式。爲此,我們必須在DateTimeFormatterBuilder
的幫助下建立自己的DateTimeFormatter
。
DateTimeFormatterBuilder
有一個方法appendText(field, textLookup)
其目標是在給定的映射中查找讀取的文本並將其替換爲與此值關聯的鍵。這意味着我們需要建立一個包含所有可能日期(1到31)的地圖及其相應的後綴。
我從this answer轉換了代碼。
我們還需要確保解析AM/PM標識符而忽略大小寫(默認情況下,它會以大寫形式查找AM和PM,但是您的大小寫是小寫的)。這是通過在爲此附加模式之前調用parseCaseInsensitive
來完成的。
private static final Map<Long, String> DAYS_LOOKUP =
IntStream.rangeClosed(1, 31).boxed().collect(toMap(Long::valueOf, i -> getOrdinal(i)));
public static void main(String[] args) throws Exception {
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM")
.appendLiteral(" ")
.appendText(ChronoField.DAY_OF_MONTH, DAYS_LOOKUP)
.appendLiteral(" ")
.appendPattern("yyyy")
.appendLiteral(", ")
.appendPattern("hh")
.appendLiteral(":")
.appendPattern("mm")
.appendLiteral(":")
.appendPattern("ss")
.appendLiteral(" ")
.parseCaseInsensitive()
.appendPattern("a")
.toFormatter(Locale.ENGLISH);
LocalDateTime dateTime = formatter.parse("September 22nd 2015, 10:39:42 am", LocalDateTime::from);
String text = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss").format(dateTime);
System.out.println(text);
}
private static String getOrdinal(int n) {
if (n >= 11 && n <= 13) {
return n + "th";
}
switch (n % 10) {
case 1: return n + "st";
case 2: return n + "nd";
case 3: return n + "rd";
default: return n + "th";
}
}
您正在使用哪個Java版本? Java SE 8? – Puce
你有試過任何東西嗎? – Satya
@Puce,是的我正在使用Java SE 8 – Sourabh