格式化字符串 java 中的日期
Formatting string to date in java
我想比较 WebElements 日期以验证排序是否正确。但是,日期的值例如如下所示:
“2021 年 4 月 5 日 12:30pm”,
“2018 年 10 月 22 日 09:18am”,
“2015 年 2 月 1 日 11:36pm”,
我试过下面的代码,但它返回 1970 作为日期,并且对于日期为 2 位数字的情况返回错误:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM d yyyy HH:mma", Locale.US);
LocalDate date = LocalDate.parse(dt, dateFormatter);
// or
Date sdf = new SimpleDateFormat("MMMM d u hh:mma").parse(dt);
格式模式d
只接受数字,不接受st、nd、rd、th
使用带有 [
和 ]
的可选部分。
此外,a
应与 hh
一起使用,而不是 HH
。
好的。似乎 Locale.US
只接受“AM”和“PM”,而 Locale.UK
只接受“am”和“pm”。
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM d['st']['nd']['rd']['th'] yyyy hh:mma", Locale.UK);
LocalDate date = LocalDate.parse(dt, dateFormatter);
或
DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("MMMM d['st']['nd']['rd']['th'] yyyy hh:mma")
.toFormatter(Locale.US);
LocalDate date = LocalDate.parse(dt, dateFormatter);
您可以使用 DateTimeFormatterBuilder
创建一个 DateTimeFormatter
来解析具有“st”、“nd”、“rd”和“th”后缀的月中的几天,还有小写的 AMPM。
// first create a map containing mapping the days of month to the suffixes
HashMap<Long, String> map = new HashMap<>();
for (long i = 1 ; i <= 31 ; i++) {
if (i == 1 || i == 21 || i == 31) {
map.put(i, i + "st");
} else if (i == 2 || i == 22){
map.put(i, i + "nd");
} else if (i == 3 || i == 23) {
map.put(i, i + "rd");
} else {
map.put(i, i + "th");
}
}
DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
.appendPattern("MMMM ")
.appendText(ChronoField.DAY_OF_MONTH, map) // here we use the map
.appendPattern(" yyyy HH:mm")
.appendText(ChronoField.AMPM_OF_DAY, Map.of(0L, "am", 1L, "pm")) // here we handle the lowercase AM PM
.toFormatter(Locale.US);
用法:
LocalDateTime datetime = LocalDateTime.parse("April 5th 2021 12:30pm", dateFormatter);
我想比较 WebElements 日期以验证排序是否正确。但是,日期的值例如如下所示: “2021 年 4 月 5 日 12:30pm”, “2018 年 10 月 22 日 09:18am”, “2015 年 2 月 1 日 11:36pm”,
我试过下面的代码,但它返回 1970 作为日期,并且对于日期为 2 位数字的情况返回错误:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM d yyyy HH:mma", Locale.US);
LocalDate date = LocalDate.parse(dt, dateFormatter);
// or
Date sdf = new SimpleDateFormat("MMMM d u hh:mma").parse(dt);
格式模式d
只接受数字,不接受st、nd、rd、th
使用带有 [
和 ]
的可选部分。
此外,a
应与 hh
一起使用,而不是 HH
。
好的。似乎 Locale.US
只接受“AM”和“PM”,而 Locale.UK
只接受“am”和“pm”。
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM d['st']['nd']['rd']['th'] yyyy hh:mma", Locale.UK);
LocalDate date = LocalDate.parse(dt, dateFormatter);
或
DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("MMMM d['st']['nd']['rd']['th'] yyyy hh:mma")
.toFormatter(Locale.US);
LocalDate date = LocalDate.parse(dt, dateFormatter);
您可以使用 DateTimeFormatterBuilder
创建一个 DateTimeFormatter
来解析具有“st”、“nd”、“rd”和“th”后缀的月中的几天,还有小写的 AMPM。
// first create a map containing mapping the days of month to the suffixes
HashMap<Long, String> map = new HashMap<>();
for (long i = 1 ; i <= 31 ; i++) {
if (i == 1 || i == 21 || i == 31) {
map.put(i, i + "st");
} else if (i == 2 || i == 22){
map.put(i, i + "nd");
} else if (i == 3 || i == 23) {
map.put(i, i + "rd");
} else {
map.put(i, i + "th");
}
}
DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
.appendPattern("MMMM ")
.appendText(ChronoField.DAY_OF_MONTH, map) // here we use the map
.appendPattern(" yyyy HH:mm")
.appendText(ChronoField.AMPM_OF_DAY, Map.of(0L, "am", 1L, "pm")) // here we handle the lowercase AM PM
.toFormatter(Locale.US);
用法:
LocalDateTime datetime = LocalDateTime.parse("April 5th 2021 12:30pm", dateFormatter);