Java8 yyyy/MM/dd和uuuu/MM/dd的不同

编程入门 行业动态 更新时间:2024-10-17 17:18:03

Java8 <a href=https://www.elefans.com/category/jswz/34/1734621.html style=yyyy/MM/dd和uuuu/MM/dd的不同"/>

Java8 yyyy/MM/dd和uuuu/MM/dd的不同

参考资料

  1. Using new Java 8 DateTimeFormatter to do strict date parsing
  2. Javaにおける日付文字列の書式チェック方法
  3. Java8のDate and Time APIではyyyyじゃなくてuuuuを使う

目录

  • 零. 总结
  • 一. 非严格模式下
  • 二. 严格模式下
    • 2.1 yyyy
    • 2.2 uuuu
  • 三. JapaneseDate


零. 总结

⏹在Java8的新日期API下,yyyy代表公元纪年(year-of-era),而uuuu代表和公元没有关系的年
⏹使用java8的日期API进行开发的时候,大多数使用的都是uuuu
⏹字符串转换为LocalDate等时间的时候,建议开启严格模式。


一. 非严格模式下

2023/02/29为例子,2023年的2月份不可能有29天。

  • 若允许此日期合法,则为非严格。
  • 若不允许此日期合法,则为严格。

⏹当DateTimeFormatter.ofPattern()进行非严格模式下的格式化的时候,
yyyy/MM/dduuuu/MM/dd表现相同,都是转换为合法的日期。

String str1 = "2023/02/29";DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate localDate1 = LocalDate.parse(str1, formatter1);
System.out.println(localDate1);  // 2023-02-28DateTimeFormatter 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

⏹虽然2023/02/28是一个合法的日期,但是yyyy代表公元纪年,且开启了严格模式,2023/02/28并不包含公元,因此程序报错。

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
}

⏹这次使用G yyyy/MM/dd来进行格式化,并且日期也添加了西暦,因此在严格模式下也能格式化成功。

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

⏹因为开启了严格模式下的日期格式化,因此2023/02/29这种不存在的日期会异常。

// 严格模式下的日期格式化
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

⏹若想让日期格式化之后含日本年号,则应使用G yy/MM/dd

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/22JapaneseDate 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

更多推荐

Java8 yyyy/MM/dd和uuuu/MM/dd的不同

本文发布于:2024-03-13 08:46:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733600.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:yyyy   MM   uuuu   dd

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!