资讯专栏INFORMATION COLUMN

Calendar工具类对跨年的星期的处理个人总结

王笑朝 / 2316人阅读

摘要:在设置或获得或字段时,必须确定一个月或一年的第一个星期,以此作为参考点。一个月或一年的第一个星期被确定为开始于的最早七天,它最少包含那一个月或一年的天数。例如,特定子类可能将某一年第个星期之前的那个星期指定为前一年的第个星期。

Calendar工具类解释

首先解释下Calendar工具类的作用。根据API的解释,Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些基础方法,其中瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
那么Calendar工具类是如何界定跨年或者跨月份的星期定义呢?举个例子:

如上图所示,2020年1月1日是星期三,那么它是算2020年的第一周呢还是2019年的最后一周?诸如如此的跨年份或者跨月份导致星期界定不明的情况,Calendar工具类提供了两个方法去个性化定义此类问题,一个方法是getFirstDayOfWeek(),另一个方法是getMinimalDaysInFirstWeek(),这两个方法相辅相成,共同完成对此类问题的定义。下面对这两个方法进行详细介绍。

getFirstDayOfWeek()和getMinimalDaysInFirstWeek()方法

getFirstDayOfWeek()方法官方API是这么解释的:获取一星期的第一天。而getMinimalDaysInFirstWeek()方法官方API是这么定义的:获取一年中第一个星期所需的最少天数。那么这两个方法是如何共同定义的呢?先放官方api解释:

Calendar 使用两个参数定义了特定于语言环境的 7 天制星期:星期的第一天和第一个星期中的最小一天(从 1 到 7)。
这些数字取自构造 Calendar 时的语言环境资源数据。还可以通过为其设置值的方法来显式地指定它们。
在设置或获得 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段时,Calendar 必须确定一个月或一年的第一个星期,以此作为参考点。
一个月或一年的第一个星期被确定为开始于 getFirstDayOfWeek() 的最早七天,它最少包含那一个月或一年的 getMinimalDaysInFirstWeek() 天数。
第一个星期之前的各星期编号为 ...、-1、0;之后的星期编号为 2、3、...。注意,get() 返回的标准化编号方式可能有所不同。
例如,特定 Calendar 子类可能将某一年第 1 个星期之前的那个星期指定为前一年的第 n 个星期。

是不是感觉一头雾水?那么接下来通过几个例子就能简单明了解释他俩各自产生的效果了。
首先我们定义一星期的第一天为周一(MONDAY),然后要求一年的第一周必须要6天,即如下所示:

那么对于2020年1月1号而言,因为定义了一周开始是周一,那么1月1号所在的周为20191230-20200105这个星期,然后我们又规定了一年的第一周至少6天才能算该年第一周,但是在20191230-20200105这个星期内,只有12345号在2020年,共5天不满足条件,因此2020年1月1号将归属于2019年的最后一周而不是2020年的第一周,运行结果如下所示:


那么如果我们把getMinimalDaysInFirstWeek()方法的参数改为5天而一星期的开始仍未周一呢?也就是说一年的第一周至少5天,由日历可知,20191230-20200105这个星期内,12345号都在2020年,即满足了getMinimalDaysInFirstWeek()方法的条件,因此此时2020年1月1号将被归属到2020年的第一周,运行结果如下:


同理,我们修改一下一周开始的时间,规定为一周开始时间是周日(SUNDAY),那么2020年1月1号在20191229-20200104这个星期内,getMinimalDaysInFirstWeek()参数我们不变仍未之前的5天,那么由日历可知,在20191229-20200104这个星期内,只有1234号这四天在2020年,不满足至少5天的条件,因此此时2020年1月1号将被划分到2019年的最后一周,结果如下:



那么如果说一周开始是周日的话怎么修改才能让2020年1月1号算在2020年的第一周呢?只需要规定一年的第一周至少4天即可,也就是getMinimalDaysInFirstWeek()方法的参数小于4就行了,我们将参数改为4,运行结果如下:


果然2020年1月1号归属到2020年第一周去了。

参数细节

getFirstDayOfWeek()方法的参数是周一到周日没什么问题,但是getMinimalDaysInFirstWeek()的参数范围又是多少呢?正常按照我们的理解参数范围1-7都是很好理解的,但是当参数不在这个范围内又会发生什么?首先我们将参数规定为8看看会发生什么,一周开始定为周一。

对于2020年1月1号,自然不满足条件,只能被归属到2019年最后一周,但是若是2020年1月6号呢?它属于20200106-20200112这个星期,但是跨年的那个星期按照我们的理解只有5天是小于我们规定的8天的,因此它属于一年的第一周?运行结果:


符合我们的期望,转念一想其实就明白了,参数为8时跨年的那周永远不满足条件,第一周只会顺延到跨年那周的下一周,因此我们可以认为getMinimalDaysInFirstWeek()的参数大于8是没有意义的。
那么如果小于1又会如何?我们将参数定义为0试试:

没问题,符合我们的期望,如果说负数呢?

仍未第一周,因此我们可以总结一下getMinimalDaysInFirstWeek()参数的范围为0-7,超出这个范围的参数无意义。

方法细节(重要!)

对于getMinimalDaysInFirstWeek()和getFirstDayOfWeek()方法,并不是说设置了这两个方法的值之后,就能取到你所设置的值的日期,例如你定义一周开始是周一,如果是当前是周一的话,通过get (Calendar.DAY_OF_WEEK)你认为就能取到1,但是测试发现结果仍然为2,因为默认一周开始就是周日(1)。那么难道说我这个设置一周开始为周一没有生效?
其实并不是这样,对于这两个方法而言,当你在这两个方法设置了参数时,只能对WEEK_OF_MONTH 与WEEK_OF_YEAR 生效,即当你想要获取当前日期对象在当前月份是第几周或者当前年份第几周时才会生效,就正如本文前面所打印的结果一样,只会对WEEK_OF_MONTH 与WEEK_OF_YEAR起作用。

总结

getMinimalDaysInFirstWeek()和getFirstDayOfWeek()方法其实是相辅相成的,因此当我们需要自定义跨年星期的时候最好是两个方法的参数都设置一下,这样对于程序而言更为严谨。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70248.html

相关文章

  • Python中对日期时间处理

    摘要:中提供了一个和的模块可以用来做格式化日期和时间的。格式化日期通过模块中方法来格式化日期函数接收时间元组并返回以可读字符串表示薪资的时间格式的话由参数决定。每日宽度间隔为字符每行的长度为是每星期的行数。 我们可以通过学习在Python中对日期时间的处理,可以在快速的完成工作,比如: 将日期时间作为日志信息的内容输入 计算某一个功能的执行时间 用日期命名一个文件的名称 记录或者展示文件的...

    techstay 评论0 收藏0
  • Java编程基础15——正则表达式&常用工具

    摘要:正则表达式的概述和简单使用正则表达式是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。例如,在表达式中,存在四个这样的组组零始终代表整个表达式。 1_正则表达式的概述和简单使用 A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个...

    miqt 评论0 收藏0
  • python日期时间处理总结

    摘要:用了一段时间的开发项目,也是第一次用来开发项目,所有有许多相关的知识点需要总结,本文所介绍的的日期时间处理就是最近用到的,希望对各位有所帮助,也同时作为自己的笔记储存。提供了等模块用于处理日期和时间,较为常用的还是模块。 用了一段时间的django开发web项目,也是第一次用python来开发项目,所有有许多相关的知识点需要总结,本文所介绍的python的日期时间处理就是最近用到的,希...

    DoINsiSt 评论0 收藏0
  • Android 时间与日期操作类

    摘要:获取本地日期与时间时间格式年月日一年的第几天一个月的第几星期一年的第几星期时时区小时小时制小时小时制分秒毫秒星期上午下午计算相隔天数获得天数差计算时间差这样得到的差值是毫秒级别已到期分钟精确天小时分钟天小时判断日期获取本地日期与时间 public String getCalendar() { @SuppressLint(SimpleDateFormat) SimpleDa...

    inapt 评论0 收藏0
  • DateTools使用「日期工具库」

    摘要:一准备下载是中简化日期和时间处理的工具二安装手动安装所需的所有类包含在文件夹下如下如果你的工程想要支持国际化或者使用功能必须要导入文件你可以在工程中下添加来添加支持的语言包含了所有其他文件的头文件在你的工程中导入头文件即可中包含个子库三基 showImg(https://segmentfault.com/img/remote/1460000009096795); 一、准备 DateTo...

    CoderDock 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<