当某个星期跨年的时候,mysql的date_format()认为这个星期是属于前一年的
select date_format('2020-01-01', '%X-%V')
结果为
'2019-52'
如何创建一个DateTimeFormatter
使格式化结果与mysql的'%X-%V'
相同?
尝试过以下方法,并不一致
final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral("-")
.appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2).toFormatter();
System.out.println(LocalDate.parse("2020-01-01").format(formatter));//2020-01
System.out.println(LocalDate.parse("2020-12-31").format(formatter));//2020-53
System.out.println(LocalDate.parse("2019-01-01").format(formatter));//2019-01
System.out.println(LocalDate.parse("2020-05-31").format(formatter));//2020-22
System.out.println();
final DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY-ww");
System.out.println(LocalDate.parse("2020-01-01").format(formatter2));//2020-01
System.out.println(LocalDate.parse("2020-12-31").format(formatter2));//2021-01
System.out.println(LocalDate.parse("2019-01-01").format(formatter2));//2019-01
System.out.println(LocalDate.parse("2020-05-31").format(formatter2));//2020-23
粗略看了下源码,似乎是得自己实现两个TemporalField
orz
通过
java.time.temporal.WeekFields#of(java.time.DayOfWeek, int)
方法可以方便地获得自定义规则的TemporalField实例。两个参数:
调用
WeekFields.of(DayOfWeek.SUNDAY, 7)
即可得到对应mysql5.7中'%X-%V'
格式的规则输出
mysql 5.7对照
输出
tips
WeekFields
定义了两个常量实例:public static final WeekFields ISO = new WeekFields(DayOfWeek.MONDAY, 4)
由ISO-8601定义的规则,一周从星期一开始,第一周至少需要4天public static final WeekFields SUNDAY_START = WeekFields.of(DayOfWeek.SUNDAY, 1)
欧洲国家和美国使用的规则。(This week definition is in use in the US and other European countries) 一周从星期天开始,第一周至少需要1天