参考资料
- Using new Java 8 DateTimeFormatter to do strict date parsing
- Javaにおける日付文字列の書式チェック方法
- Java8のDate and Time APIではyyyyじゃなくてuuuuを使う
目录
- 零. 总结
- 一. 非严格模式下
- 二. 严格模式下
-
- 2.1 yyyy
- 2.2 uuuu
- 三. JapaneseDate
零. 总结
?在Java8的新日期API下,
?使用java8的日期API进行开发的时候,大多数使用的都是
?字符串转换为LocalDate等时间的时候,建议开启严格模式。
一. 非严格模式下
以
- 若允许此日期合法,则为非严格。
- 若不允许此日期合法,则为严格。
?当
String str1 = "2023/02/29";
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate localDate1 = LocalDate.parse(str1, formatter1);
System.out.println(localDate1); // 2023-02-28
DateTimeFormatter formatter1_1 = DateTimeFormatter.ofPattern("uuuu/MM/dd");
LocalDate localDate1_1 = LocalDate.parse(str1, formatter1_1);
System.out.println(localDate1_1); // 2023-02-28
二. 严格模式下
DateTimeFormatter.ofPattern() 通过.withResolverStyle(ResolverStyle.STRICT) 来开启严格模式。
2.1 yyyy
?虽然
String str2 = "2023/02/28";
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd")
.withResolverStyle(ResolverStyle.STRICT);
try {
LocalDate localDate2 = LocalDate.parse(str2, formatter2);
System.out.println(localDate2);
} catch (Exception ex) {
System.out.println(ex.getMessage());
// Text '2023/02/28' could not be parsed:
// Unable to obtain LocalDate from TemporalAccessor:
// {DayOfMonth=28, YearOfEra=2023, MonthOfYear=2},ISO of type java.time.format.Parsed
}
?这次使用
String str3 = "西暦 2023/02/28";
/*
* Locale.JAPAN --> "西暦 2023/02/28"
* Locale.CHINA --> "公元 2023/02/28"
* Locale.US --> "AD 2023/02/28"
*/
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("G yyyy/MM/dd", Locale.JAPAN)
.withResolverStyle(ResolverStyle.STRICT);
LocalDate localDate3 = LocalDate.parse(str3, formatter3);
System.out.println(localDate3); // 2023-02-28
2.2 uuuu
?因为开启了严格模式下的日期格式化,因此
// 严格模式下的日期格式化
DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern("uuuu/MM/dd")
.withResolverStyle(ResolverStyle.STRICT);
try {
LocalDate.parse("2023/02/29", formatter4);
} catch (Exception ex) {
System.out.println(ex.getMessage());
// Text '2023/02/29' could not be parsed: Invalid date 'February 29' as '2023' is not a leap year
}
LocalDate localDate4 = LocalDate.parse("2023/02/28", formatter4);
System.out.println(localDate4); // 2023-02-28
三. JapaneseDate
?若想让日期格式化之后含日本年号,则应使用
import java.time.chrono.JapaneseDate;
JapaneseDate japaneseDate1 = JapaneseDate.of(2017, 10, 22);
String japaneseDate_str_1 = japaneseDate1.format(DateTimeFormatter.ofPattern("G uuuu/MM/dd", Locale.JAPAN));
System.out.println(japaneseDate_str_1); // 平成 2017/10/22
JapaneseDate japaneseDate2 = JapaneseDate.from(LocalDate.now());
String japaneseDate_str_2 = japaneseDate2.format(DateTimeFormatter.ofPattern("G yyyy/MM/dd", Locale.JAPAN));
System.out.println(japaneseDate_str_2); // 平成 0035/09/27