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文档。如文章有错请各位大佬及时纠正,评论留言。

Logo

更多推荐