ISO8601自然周
自然周的标准很多。其中以ISO8601 为准。
可以看到一年的第一个自然周应当满足:
- 有第一个星期四
- 包含1月4号
- 第一个自然周应当有4个或者4个以上的天数
- 这个星期开始的时间(即周一)在去年的12月29号(星期一)到今年的1月4号之间
所以如果1月1号是周一、周二、周三或者周四,它属于第一个自然周,如果不是,他属于去年的52周或者53周。
mysql week()获取自然周
这里我们可以看week传入两个参数,一个是日期,一个是模式。模式分为表中的几种,默认是0。在表中有一句话“with 4 or more days this year,”代表该模式遵循的是ISO标准。在mysql中更为常用的是
WEEKOFYEAR(date)
函数,实际上也等价于WEEK(date,3).
java8 localdate 获取自然周
java8对时间类型的支持和joda非常相似,但是比joda还要开放。所以标准就很重要,希望大家能理解一下上面ISO标准。
java8对自然周的支持主要体现java.time.temporal.WeekFields
这个类中。
其初始化有几种方式,这里讲两种,第一种是WeekFields.of(DayOfWeek firstDayOfWeek, int minimalDaysInFirstWeek)
:
WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY,4);
第一个参数代表周是按周几开始,第二个是限定第一个自然周最少要几天。结合ISO标准我们应当像上面那样进行初始化。
第二种方式是:WeekFields weekFields1 = WeekFields.ISO;
这样。查看源码发现:public static final WeekFields ISO = new WeekFields(DayOfWeek.MONDAY, 4);
调用了内部私有的构造方法。实际上和第一种大同小异。
具体实现获取
LocalDate localDate1 = LocalDate.now();
WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY,4);
return localDate.get(weekFields.weekOfWeekBasedYear());
这里的return返回的就是符合ISO标准的自然周。当然关于weekfieldsd的初始化我更加推荐第二种。
另外weekFields的有两个获取自然周的实例方法weekOfYear()和weekOfWeekBasedYear()
他们的差异当weekOfYear()
第一周少于最小天数时会返回0,另一个则是返回1或者去年的末尾周:
详见各API文档。如文章有错请各位大佬及时纠正,评论留言。