- 浏览: 55352 次
- 性别:
- 来自: 希伯來
文章分类
最新评论
-
kalman03:
顶坐拥4w女神而不倒!
深入理解EventBus的设计思想 -
beneo:
大海lb 写道楼主,我想问下,就是在运行kmeans的时候那个 ...
一个基于Mahout与hadoop的聚类搭建 -
大海lb:
楼主,我想问下,就是在运行kmeans的时候那个-c 如何指定 ...
一个基于Mahout与hadoop的聚类搭建 -
changchang:
很好,收了~
RabbitVCS -
chenchangqun11:
20岁 技术就学这么好 你是怎么学的?
看完后我沉默很久..所谓“优秀生”?..一篇转载,献给所有和我一样迷茫没有目标的人
项目有个需求,每天生成一个文件。开始觉得用一个TimeTask或者ScheduledThreadPoolExecutor或者quartz来做,突然觉得太overweight了。后来想到了log4j的DailyRollingFileAppender,果然是我想要的,类似于quartz,通过与类似nextFireTime的参数作比较,判断是否触发append到新文件,不过这不是这篇博文要讲的。我有注意到了这个类,在DailyRollingFileAppender有个inner class RollingCalendar。
这个类的作用也说明了,是computes the start of the next interval
本人才疏学浅,真的不知道为啥GregorianCalendar要叫这个英文名字,一看原来还是jdk自带的类。。所有膜拜了一下google,wiki大神,与大家分享一下
以下是来自API的翻译:
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在 1582 年 10 月 15 日创立,在其他国家/地区要晚一些)。可由调用者通过调用 setGregorianChange() 来更改起始日期。
历史上,在那些首先采用格里高利历的国家/地区中,1582 年 10 月 4 日(儒略历)之后就是 1582 年 10 月 15 日(格里高利历)。此日历正确地模拟了这些变化。在开始格里高利历之前,GregorianCalendar 实现的是儒略历。格里高利历和儒略历之间的唯一区别就是闰年规则。儒略历指定每 4 年就为闰年,而格里高利历则忽略不能被 400 整除的世纪年。
GregorianCalendar 可实现预期的 格里高利历和儒略历。也就是说,可以通过在时间上无限地向后或向前外推当前规则来计算日期。因此,对于所有的年份,都可以使用 GregorianCalendar 来生成有意义并且一致的结果。但是,采用现代儒略历规则时,使用 GregorianCalendar 得到的日期只在历史上从公元 4 年 3 月 1 日之后是准确的。在此日期之前,闰年规则的应用没有规则性,在 45 BC 之前,甚至不存在儒略历。
在格里高利历创立以前,新年是 3 月 25 日。为了避免混淆,此日历始终使用 1 月 1 日为新年。如果想要格里高利历转换之前并且处于 1 月 1 日和 3 月 24 日之间的日期,则可以进行手动调整。
为 WEEK_OF_YEAR 字段所计算的值的范围从 1 到 53。一年的第一个星期始于 getFirstDayOfWeek() 的最早 7 天,至少包含该年的 getMinimalDaysInFirstWeek() 各天。这取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 的值以及 1 月 1 日是星期几。一年的第一个星期和下一年的第一个星期之间的各个星期按顺序从 2 到 52 或 53(根据需要)进行编号。
例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 为 MONDAY,并且 getMinimalDaysInFirstWeek() 为 4(这些值反映了 ISO 8601 和很多国家/地区标准),则 1998 年的第一个星期开始于 1997 年 12 月 29 日,结束于 1998 年 1 月 4 日。但是,如果 getFirstDayOfWeek() 为 SUNDAY,那么 1998 年的第一个星期开始于 1998 年 1 月 4 日,结束于 1998 年 1 月 10 日;1998 年头三天是 1997 年第 53 个星期的一部分。
为 WEEK_OF_MONTH 字段所计算的值的范围从 0 到 6。一个月的第一个星期(WEEK_OF_MONTH = 1 的日期)是该月至少连续 getMinimalDaysInFirstWeek() 天中的最早日期,结束于 getFirstDayOfWeek() 的前一天。与一年的第一个星期不同,一个月的第一个星期可能短于 7 天,也不必从 getFirstDayOfWeek() 这一天开始,并且不包括前一个月的日期。在第一个星期之前该月日期的 WEEK_OF_MONTH 为 0。
例如,如果 getFirstDayOfWeek() 为 SUNDAY,getMinimalDaysInFirstWeek() 为 4,那么 1998 年 1 月的第一个星期是从 1 月 4 日星期日到 1 月 10 日星期六。这些天的 WEEK_OF_MONTH 为 1。1 月 1 日星期四到 1 月 3 日星期六的 WEEK_OF_MONTH 为 0。如果 getMinimalDaysInFirstWeek() 变为 3,则 1 月 1 日到 1 月 3 日的 WEEK_OF_MONTH 为 1。
clear 方法将日历字段设置为未定义。GregorianCalendar 为每个日历字段使用以下默认值(如果该值未定义)。
1582年之前的事情就不管了,我们就用好Gregorian历就可以了。上面红色的话,我们用2011年1月1日来做测试看看
实际代码测试:
那么,红色部分的说明可以修改为2011年1月1日是星期六,如果 getFirstDayOfWeek() 为 SUNDAY,并且 getMinimalDaysInFirstWeek() 为 1,则 2011 年的第一个星期开始于 2010 年 12 月 26 日,结束于 2011 年 1 月 1 日。
但是,如果 getFirstDayOfWeek() 为 MONDAY,并且getMinimalDaysInFirstWeek() 为4, 那么 2011 年的第一个星期开始于 2010 年 12 月 27 日,结束于 2011 年 1 月 2 日;2011 年头2天是 2010 年第 52 个星期的一部分
WEEK_OF_MONTH可以按照上面的方法自行测试。
GregorianCalendar用于定时任务:
这样自己就能通过Gregoriancalendar实现一个简单的定时任务了。
这个类的作用也说明了,是computes the start of the next interval
/** * RollingCalendar is a helper class to DailyRollingFileAppender. * Given a periodicity type and the current time, it computes the * start of the next interval. * */ class RollingCalendar extends GregorianCalendar { // ...... 不关心,省略掉好了 }
本人才疏学浅,真的不知道为啥GregorianCalendar要叫这个英文名字,一看原来还是jdk自带的类。。所有膜拜了一下google,wiki大神,与大家分享一下
以下是来自API的翻译:
引用
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在 1582 年 10 月 15 日创立,在其他国家/地区要晚一些)。可由调用者通过调用 setGregorianChange() 来更改起始日期。
历史上,在那些首先采用格里高利历的国家/地区中,1582 年 10 月 4 日(儒略历)之后就是 1582 年 10 月 15 日(格里高利历)。此日历正确地模拟了这些变化。在开始格里高利历之前,GregorianCalendar 实现的是儒略历。格里高利历和儒略历之间的唯一区别就是闰年规则。儒略历指定每 4 年就为闰年,而格里高利历则忽略不能被 400 整除的世纪年。
GregorianCalendar 可实现预期的 格里高利历和儒略历。也就是说,可以通过在时间上无限地向后或向前外推当前规则来计算日期。因此,对于所有的年份,都可以使用 GregorianCalendar 来生成有意义并且一致的结果。但是,采用现代儒略历规则时,使用 GregorianCalendar 得到的日期只在历史上从公元 4 年 3 月 1 日之后是准确的。在此日期之前,闰年规则的应用没有规则性,在 45 BC 之前,甚至不存在儒略历。
在格里高利历创立以前,新年是 3 月 25 日。为了避免混淆,此日历始终使用 1 月 1 日为新年。如果想要格里高利历转换之前并且处于 1 月 1 日和 3 月 24 日之间的日期,则可以进行手动调整。
为 WEEK_OF_YEAR 字段所计算的值的范围从 1 到 53。一年的第一个星期始于 getFirstDayOfWeek() 的最早 7 天,至少包含该年的 getMinimalDaysInFirstWeek() 各天。这取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 的值以及 1 月 1 日是星期几。一年的第一个星期和下一年的第一个星期之间的各个星期按顺序从 2 到 52 或 53(根据需要)进行编号。
例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 为 MONDAY,并且 getMinimalDaysInFirstWeek() 为 4(这些值反映了 ISO 8601 和很多国家/地区标准),则 1998 年的第一个星期开始于 1997 年 12 月 29 日,结束于 1998 年 1 月 4 日。但是,如果 getFirstDayOfWeek() 为 SUNDAY,那么 1998 年的第一个星期开始于 1998 年 1 月 4 日,结束于 1998 年 1 月 10 日;1998 年头三天是 1997 年第 53 个星期的一部分。
为 WEEK_OF_MONTH 字段所计算的值的范围从 0 到 6。一个月的第一个星期(WEEK_OF_MONTH = 1 的日期)是该月至少连续 getMinimalDaysInFirstWeek() 天中的最早日期,结束于 getFirstDayOfWeek() 的前一天。与一年的第一个星期不同,一个月的第一个星期可能短于 7 天,也不必从 getFirstDayOfWeek() 这一天开始,并且不包括前一个月的日期。在第一个星期之前该月日期的 WEEK_OF_MONTH 为 0。
例如,如果 getFirstDayOfWeek() 为 SUNDAY,getMinimalDaysInFirstWeek() 为 4,那么 1998 年 1 月的第一个星期是从 1 月 4 日星期日到 1 月 10 日星期六。这些天的 WEEK_OF_MONTH 为 1。1 月 1 日星期四到 1 月 3 日星期六的 WEEK_OF_MONTH 为 0。如果 getMinimalDaysInFirstWeek() 变为 3,则 1 月 1 日到 1 月 3 日的 WEEK_OF_MONTH 为 1。
clear 方法将日历字段设置为未定义。GregorianCalendar 为每个日历字段使用以下默认值(如果该值未定义)。
1582年之前的事情就不管了,我们就用好Gregorian历就可以了。上面红色的话,我们用2011年1月1日来做测试看看
实际代码测试:
public class GregorianCalendarDemo { private GregorianCalendar calendar; public final static int SUNDAY = 1; public final static int MONDAY = 2; public final static int TUESDAY = 3; public final static int WEDNESDAY = 4; public final static int THURSDAY = 5; public final static int FRIDAY = 6; public final static int SATURDAY = 7; @BeforeMethod public void setup() { calendar = new GregorianCalendar(); } @Test public void getFirstDayOfWeek_accuracy() { // 每周的第一天是周日 Assert.assertEquals(calendar.getFirstDayOfWeek(), SUNDAY); // 设定每周的第一天是周一 calendar.setFirstDayOfWeek(MONDAY); // 每周的第一天是周一 Assert.assertEquals(calendar.getFirstDayOfWeek(), MONDAY); } @Test public void getFirstWeekOfYear_accuracy() { //在我的机器上面,返回的是1,看来中国不属于“ISO 8601 和很多国家/地区标准” //这表示,含有2011年第一天的那周,都算为2011年第一周 Assert.assertEquals(calendar.getMinimalDaysInFirstWeek(), 1); calendar.setTime(new GregorianCalendar(2010, 11, 31).getTime());// 这是2010年12月31日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // 这个2011年的第一周 calendar.setTime(new GregorianCalendar(2010, 11, 26).getTime());// 这是2010年12月25日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // 这也是2011年的第一周 //让中国属于 “ISO 8601 和很多国家/地区标准” calendar.setMinimalDaysInFirstWeek(4); //这表示,至少2011年1月份前4天在的同一周,那这一周就视为2011年的,正好只有1、2号在同一周,3、4号不再,那么这周还算2010年的 Assert.assertEquals(calendar.getMinimalDaysInFirstWeek(), 4); calendar.setTime(new GregorianCalendar(2011, 0, 1).getTime());// 这是2011年1月1日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 52); // 这个2010年的第52周 calendar.setTime(new GregorianCalendar(2011, 0, 2).getTime());// 这是2011年1月2日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // 这个2011年的第1周,因为一周的第一天是SUNDAY //但是,如果我们设定一周的开始是周一的话 calendar.setFirstDayOfWeek(MONDAY); Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // error 返回说明是2010年的第52周 } }
那么,红色部分的说明可以修改为2011年1月1日是星期六,如果 getFirstDayOfWeek() 为 SUNDAY,并且 getMinimalDaysInFirstWeek() 为 1,则 2011 年的第一个星期开始于 2010 年 12 月 26 日,结束于 2011 年 1 月 1 日。
但是,如果 getFirstDayOfWeek() 为 MONDAY,并且getMinimalDaysInFirstWeek() 为4, 那么 2011 年的第一个星期开始于 2010 年 12 月 27 日,结束于 2011 年 1 月 2 日;2011 年头2天是 2010 年第 52 个星期的一部分
WEEK_OF_MONTH可以按照上面的方法自行测试。
GregorianCalendar用于定时任务:
// 获得下一分钟的时间 @Test public void getNextMinuteTime() { Date date = new Date(); calendar.setTime(date); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.MINUTE, 1); System.out.println("this time: " + date); System.out.println("next minute time: " + calendar.getTime()); } // 获得下周的第一天的时间 @Test public void getTopOfWeekTime() { Date date = new Date(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.WEEK_OF_YEAR, 1); System.out.println("this time: " + date); System.out.println("next week time: " + calendar.getTime()); } // 获得下个月第一天的时间 @Test public void getTopOfMonthTime() { Date date = new Date(); calendar.setTime(date); calendar.set(Calendar.DATE, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.MONTH, 1); System.out.println("this time: " + date); System.out.println("next month time: " + calendar.getTime()); }
这样自己就能通过Gregoriancalendar实现一个简单的定时任务了。
评论
5 楼
tao3618341
2011-02-12
beneo 写道
项目有个需求,每天生成一个文件。开始觉得用一个TimeTask或者ScheduledThreadPoolExecutor或者quartz来做,突然觉得太overweight了。后来想到了log4j的DailyRollingFileAppender,果然是我想要的,类似于quartz,通过与类似nextFireTime的参数作比较,判断是否触发append到新文件,不过这不是这篇博文要讲的。我有注意到了这个类,在DailyRollingFileAppender有个inner class RollingCalendar。
这个类的作用也说明了,是computes the start of the next interval
本人才疏学浅,真的不知道为啥GregorianCalendar要叫这个英文名字,一看原来还是jdk自带的类。。所有膜拜了一下google,wiki大神,与大家分享一下
以下是来自API的翻译:
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在 1582 年 10 月 15 日创立,在其他国家/地区要晚一些)。可由调用者通过调用 setGregorianChange() 来更改起始日期。
历史上,在那些首先采用格里高利历的国家/地区中,1582 年 10 月 4 日(儒略历)之后就是 1582 年 10 月 15 日(格里高利历)。此日历正确地模拟了这些变化。在开始格里高利历之前,GregorianCalendar 实现的是儒略历。格里高利历和儒略历之间的唯一区别就是闰年规则。儒略历指定每 4 年就为闰年,而格里高利历则忽略不能被 400 整除的世纪年。
GregorianCalendar 可实现预期的 格里高利历和儒略历。也就是说,可以通过在时间上无限地向后或向前外推当前规则来计算日期。因此,对于所有的年份,都可以使用 GregorianCalendar 来生成有意义并且一致的结果。但是,采用现代儒略历规则时,使用 GregorianCalendar 得到的日期只在历史上从公元 4 年 3 月 1 日之后是准确的。在此日期之前,闰年规则的应用没有规则性,在 45 BC 之前,甚至不存在儒略历。
在格里高利历创立以前,新年是 3 月 25 日。为了避免混淆,此日历始终使用 1 月 1 日为新年。如果想要格里高利历转换之前并且处于 1 月 1 日和 3 月 24 日之间的日期,则可以进行手动调整。
为 WEEK_OF_YEAR 字段所计算的值的范围从 1 到 53。一年的第一个星期始于 getFirstDayOfWeek() 的最早 7 天,至少包含该年的 getMinimalDaysInFirstWeek() 各天。这取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 的值以及 1 月 1 日是星期几。一年的第一个星期和下一年的第一个星期之间的各个星期按顺序从 2 到 52 或 53(根据需要)进行编号。
例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 为 MONDAY,并且 getMinimalDaysInFirstWeek() 为 4(这些值反映了 ISO 8601 和很多国家/地区标准),则 1998 年的第一个星期开始于 1997 年 12 月 29 日,结束于 1998 年 1 月 4 日。但是,如果 getFirstDayOfWeek() 为 SUNDAY,那么 1998 年的第一个星期开始于 1998 年 1 月 4 日,结束于 1998 年 1 月 10 日;1998 年头三天是 1997 年第 53 个星期的一部分。
为 WEEK_OF_MONTH 字段所计算的值的范围从 0 到 6。一个月的第一个星期(WEEK_OF_MONTH = 1 的日期)是该月至少连续 getMinimalDaysInFirstWeek() 天中的最早日期,结束于 getFirstDayOfWeek() 的前一天。与一年的第一个星期不同,一个月的第一个星期可能短于 7 天,也不必从 getFirstDayOfWeek() 这一天开始,并且不包括前一个月的日期。在第一个星期之前该月日期的 WEEK_OF_MONTH 为 0。
例如,如果 getFirstDayOfWeek() 为 SUNDAY,getMinimalDaysInFirstWeek() 为 4,那么 1998 年 1 月的第一个星期是从 1 月 4 日星期日到 1 月 10 日星期六。这些天的 WEEK_OF_MONTH 为 1。1 月 1 日星期四到 1 月 3 日星期六的 WEEK_OF_MONTH 为 0。如果 getMinimalDaysInFirstWeek() 变为 3,则 1 月 1 日到 1 月 3 日的 WEEK_OF_MONTH 为 1。
clear 方法将日历字段设置为未定义。GregorianCalendar 为每个日历字段使用以下默认值(如果该值未定义)。
1582年之前的事情就不管了,我们就用好Gregorian历就可以了。上面红色的话,我们用2011年1月1日来做测试看看
实际代码测试:
那么,红色部分的说明可以修改为2011年1月1日是星期六,如果 getFirstDayOfWeek() 为 SUNDAY,并且 getMinimalDaysInFirstWeek() 为 1,则 2011 年的第一个星期开始于 2010 年 12 月 26 日,结束于 2011 年 1 月 1 日。
但是,如果 getFirstDayOfWeek() 为 MONDAY,并且getMinimalDaysInFirstWeek() 为4, 那么 2011 年的第一个星期开始于 2010 年 12 月 27 日,结束于 2011 年 1 月 2 日;2011 年头2天是 2010 年第 52 个星期的一部分
WEEK_OF_MONTH可以按照上面的方法自行测试。
GregorianCalendar用于定时任务:
这样自己就能通过Gregoriancalendar实现一个简单的定时任务了。
这个类的作用也说明了,是computes the start of the next interval
/** * RollingCalendar is a helper class to DailyRollingFileAppender. * Given a periodicity type and the current time, it computes the * start of the next interval. * */ class RollingCalendar extends GregorianCalendar { // ...... 不关心,省略掉好了 }
本人才疏学浅,真的不知道为啥GregorianCalendar要叫这个英文名字,一看原来还是jdk自带的类。。所有膜拜了一下google,wiki大神,与大家分享一下
以下是来自API的翻译:
引用
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在 1582 年 10 月 15 日创立,在其他国家/地区要晚一些)。可由调用者通过调用 setGregorianChange() 来更改起始日期。
历史上,在那些首先采用格里高利历的国家/地区中,1582 年 10 月 4 日(儒略历)之后就是 1582 年 10 月 15 日(格里高利历)。此日历正确地模拟了这些变化。在开始格里高利历之前,GregorianCalendar 实现的是儒略历。格里高利历和儒略历之间的唯一区别就是闰年规则。儒略历指定每 4 年就为闰年,而格里高利历则忽略不能被 400 整除的世纪年。
GregorianCalendar 可实现预期的 格里高利历和儒略历。也就是说,可以通过在时间上无限地向后或向前外推当前规则来计算日期。因此,对于所有的年份,都可以使用 GregorianCalendar 来生成有意义并且一致的结果。但是,采用现代儒略历规则时,使用 GregorianCalendar 得到的日期只在历史上从公元 4 年 3 月 1 日之后是准确的。在此日期之前,闰年规则的应用没有规则性,在 45 BC 之前,甚至不存在儒略历。
在格里高利历创立以前,新年是 3 月 25 日。为了避免混淆,此日历始终使用 1 月 1 日为新年。如果想要格里高利历转换之前并且处于 1 月 1 日和 3 月 24 日之间的日期,则可以进行手动调整。
为 WEEK_OF_YEAR 字段所计算的值的范围从 1 到 53。一年的第一个星期始于 getFirstDayOfWeek() 的最早 7 天,至少包含该年的 getMinimalDaysInFirstWeek() 各天。这取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 的值以及 1 月 1 日是星期几。一年的第一个星期和下一年的第一个星期之间的各个星期按顺序从 2 到 52 或 53(根据需要)进行编号。
例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 为 MONDAY,并且 getMinimalDaysInFirstWeek() 为 4(这些值反映了 ISO 8601 和很多国家/地区标准),则 1998 年的第一个星期开始于 1997 年 12 月 29 日,结束于 1998 年 1 月 4 日。但是,如果 getFirstDayOfWeek() 为 SUNDAY,那么 1998 年的第一个星期开始于 1998 年 1 月 4 日,结束于 1998 年 1 月 10 日;1998 年头三天是 1997 年第 53 个星期的一部分。
为 WEEK_OF_MONTH 字段所计算的值的范围从 0 到 6。一个月的第一个星期(WEEK_OF_MONTH = 1 的日期)是该月至少连续 getMinimalDaysInFirstWeek() 天中的最早日期,结束于 getFirstDayOfWeek() 的前一天。与一年的第一个星期不同,一个月的第一个星期可能短于 7 天,也不必从 getFirstDayOfWeek() 这一天开始,并且不包括前一个月的日期。在第一个星期之前该月日期的 WEEK_OF_MONTH 为 0。
例如,如果 getFirstDayOfWeek() 为 SUNDAY,getMinimalDaysInFirstWeek() 为 4,那么 1998 年 1 月的第一个星期是从 1 月 4 日星期日到 1 月 10 日星期六。这些天的 WEEK_OF_MONTH 为 1。1 月 1 日星期四到 1 月 3 日星期六的 WEEK_OF_MONTH 为 0。如果 getMinimalDaysInFirstWeek() 变为 3,则 1 月 1 日到 1 月 3 日的 WEEK_OF_MONTH 为 1。
clear 方法将日历字段设置为未定义。GregorianCalendar 为每个日历字段使用以下默认值(如果该值未定义)。
1582年之前的事情就不管了,我们就用好Gregorian历就可以了。上面红色的话,我们用2011年1月1日来做测试看看
实际代码测试:
public class GregorianCalendarDemo { private GregorianCalendar calendar; public final static int SUNDAY = 1; public final static int MONDAY = 2; public final static int TUESDAY = 3; public final static int WEDNESDAY = 4; public final static int THURSDAY = 5; public final static int FRIDAY = 6; public final static int SATURDAY = 7; @BeforeMethod public void setup() { calendar = new GregorianCalendar(); } @Test public void getFirstDayOfWeek_accuracy() { // 每周的第一天是周日 Assert.assertEquals(calendar.getFirstDayOfWeek(), SUNDAY); // 设定每周的第一天是周一 calendar.setFirstDayOfWeek(MONDAY); // 每周的第一天是周一 Assert.assertEquals(calendar.getFirstDayOfWeek(), MONDAY); } @Test public void getFirstWeekOfYear_accuracy() { //在我的机器上面,返回的是1,看来中国不属于“ISO 8601 和很多国家/地区标准” //这表示,含有2011年第一天的那周,都算为2011年第一周 Assert.assertEquals(calendar.getMinimalDaysInFirstWeek(), 1); calendar.setTime(new GregorianCalendar(2010, 11, 31).getTime());// 这是2010年12月31日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // 这个2011年的第一周 calendar.setTime(new GregorianCalendar(2010, 11, 26).getTime());// 这是2010年12月25日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // 这也是2011年的第一周 //让中国属于 “ISO 8601 和很多国家/地区标准” calendar.setMinimalDaysInFirstWeek(4); //这表示,至少2011年1月份前4天在的同一周,那这一周就视为2011年的,正好只有1、2号在同一周,3、4号不再,那么这周还算2010年的 Assert.assertEquals(calendar.getMinimalDaysInFirstWeek(), 4); calendar.setTime(new GregorianCalendar(2011, 0, 1).getTime());// 这是2011年1月1日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 52); // 这个2010年的第52周 calendar.setTime(new GregorianCalendar(2011, 0, 2).getTime());// 这是2011年1月2日, Month value is 0-based. Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // 这个2011年的第1周,因为一周的第一天是SUNDAY //但是,如果我们设定一周的开始是周一的话 calendar.setFirstDayOfWeek(MONDAY); Assert.assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), 1); // error 返回说明是2010年的第52周 } }
那么,红色部分的说明可以修改为2011年1月1日是星期六,如果 getFirstDayOfWeek() 为 SUNDAY,并且 getMinimalDaysInFirstWeek() 为 1,则 2011 年的第一个星期开始于 2010 年 12 月 26 日,结束于 2011 年 1 月 1 日。
但是,如果 getFirstDayOfWeek() 为 MONDAY,并且getMinimalDaysInFirstWeek() 为4, 那么 2011 年的第一个星期开始于 2010 年 12 月 27 日,结束于 2011 年 1 月 2 日;2011 年头2天是 2010 年第 52 个星期的一部分
WEEK_OF_MONTH可以按照上面的方法自行测试。
GregorianCalendar用于定时任务:
// 获得下一分钟的时间 @Test public void getNextMinuteTime() { Date date = new Date(); calendar.setTime(date); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.MINUTE, 1); System.out.println("this time: " + date); System.out.println("next minute time: " + calendar.getTime()); } // 获得下周的第一天的时间 @Test public void getTopOfWeekTime() { Date date = new Date(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.WEEK_OF_YEAR, 1); System.out.println("this time: " + date); System.out.println("next week time: " + calendar.getTime()); } // 获得下个月第一天的时间 @Test public void getTopOfMonthTime() { Date date = new Date(); calendar.setTime(date); calendar.set(Calendar.DATE, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.MONTH, 1); System.out.println("this time: " + date); System.out.println("next month time: " + calendar.getTime()); }
这样自己就能通过Gregoriancalendar实现一个简单的定时任务了。
4 楼
fan2012
2011-01-21
这些东西不是很基础吗
3 楼
Technoboy
2011-01-21
写的什么?
2 楼
xifo
2011-01-20
格林威治历,记得微软的Windows(好像是XP和之前的版本)在日历处理上就有个Bug,但JDK的这个实现目前还没有发现什么问题。
1 楼
ybyonline
2010-12-03
GregorianCalendar:罗马日历,
发表评论
-
深入理解EventBus的设计思想
2013-12-03 10:08 2928凌弃同学已经介绍了EventBus的使用方式 如何使 ... -
给予bit位置的锁的实现
2012-03-16 10:00 0一切都是需求出发: 需要调用一个类,但是这个类的方法不是线程安 ... -
toString 的时候
2011-09-15 08:59 0经常有一些meta对象,有时候我们希望打印出来 1. 处理某 ... -
reference
2011-05-12 15:33 0仅凭对象可以被收集并不意味着垃圾收集器的一次指定运行就能够回收 ... -
关于classpath wildcard
2011-04-22 15:37 1391在java 1.5的时候,我还得写bash脚本去loop获得所 ... -
mark一句话
2011-04-01 15:51 896Working as an effective profess ... -
为神马 1.0 - 0.7 != 0.3 ???
2011-01-21 23:54 2172直接上代码 public s ... -
乱谈,由 a += 32 与 a = a + 32 的区别开始
2011-01-19 23:55 0作坊内童鞋问了一个问题,为神马 a += 32 可以通过编译, ... -
File#renameTo(File) 为何总是不成功
2011-01-17 15:49 0有时候需要用到File#renameTo(File)一个文件或 ... -
超强的linux命令
2011-01-17 00:10 0当你出现NoClassFound这样的错误的时候,只需要在你的 ... -
为何是java.util.Map#get(Object)而不是java.util.Map#get(K key)?
2011-01-15 23:32 0在java.util.MapAPI中,你可以看到许多诸如此类的 ... -
Runtime.getRuntime().exec(...)使用方法
2011-01-15 22:49 8426上两周问答大赛的时候,看到了很多人问为什么自己调用的Runti ... -
the webapp configuration of jetty + spring + db
2011-01-15 22:39 1461自己留作一个备份,share给大家 maven-webapp的 ...
相关推荐
Kaohsiung 2006 Lucky and Good Months by Gregorian Calendar(ACM HNU 11562 题 代码) 对于日历的处理,类似于10013的题目
"Go-go-persian-calendar-Persian(SolarHijri)日历在Go(golang)中的一个实现"这个项目就是针对伊朗和阿富汗等地区广泛使用的波斯日历(也称为太阳希吉来历)的一个实现,提供了在Go语言中操作和转换波斯日历的能力。...
KendoUI阳历,波斯语,回历(伊斯兰)日历,DatePicker,TimePicker تقویمشمسی,قمریومیلادیبههمراهانتخابگرتاریخوزمان这个项目是一个分支来自: : 这个项目需要...
波斯语的Gnome-Shell日历 Gnome-Shell的扩展,以显示波斯日期和日历 安装: 克隆存储库 转到克隆的目录 运行make 重新启动Gnome-shell。 (ALT + F2,r,Enter) 您可能需要通过Gnome Tweaks启用扩展 链接: :...
Java默认提供的日历系统是“Gregorian Calendar”,这是一种广泛使用的公历系统。 #### 三、Gregorian Calendar的介绍 “Gregorian Calendar”是一种以罗马教皇格里高利十三世的名字命名的日历系统。该日历系统于...
创建自定义日历的第一步通常是初始化一个`NSCalendar`对象,选择合适的日历类型,例如公历(Gregorian): ```swift let calendar = NSCalendar(calendarIdentifier: .gregorian) ``` 接下来,我们可以利用`...
贾拉利日历 一个将Gregorian转换为Jalali(或将Jalali转换为Gregorian)的Java库。对于Gregorian日期,它使用Java8的日期,而对于Jalali日期则具有自己的代码,这些代码均受Java8的启发。 如何使用jalali-calendar?...
通过扩展GregorianCalendar,PersianCalendar支持:将Gregorian转换为Persian Calendar系统,反之亦然。 将年,月,日,小时,分钟等添加到当前日期解析字符串并产生PersianCalendar ?! 将来发布! 摆动基准日期...
React本机通用日历 :sparkles: :spiral_calendar: :tear-off_calendar: 该模块包括各种可自定义的react native日历组件。 该软件包同时兼容Android和iOS 。安装$ yarn add react-native-general-calendars 或者$ npm...
在Java编程语言中,`Calendar`类是一个核心的日期和时间API,它用于处理各种日历系统,而不仅仅是常见的格里高利历(Gregorian Calendar)。`Calendar`是一个抽象类,这意味着它不能直接被实例化,但是提供了`...
use-gregorian的目标是提供构建日历或日期选择器所需的所有功能,同时让UI和UX由您自己决定。 发展 # install dependencies yarn # run storybook yarn storybook # make sure you didn't break nothing yarn test ...
在计算机科学中,日历通常基于公历(Gregorian Calendar)进行构建,该系统以公元1582年为基准,包含了年、月、日的概念,并有闰年规则。闰年每四年出现一次,除非那一年能被100整除但不能被400整除。掌握这些基础是...
首先,日历算法是基于格里高利历(Gregorian Calendar)进行计算的,它涉及到月份天数的确定、闰年的判断以及星期的计算。在C语言中,我们可以使用结构体来存储年月日等信息。例如: ```c struct Date { int year;...
然后,`calendar.sql`文件可能包含了公历日历的数据表,设计可能与`lunar.sql`类似,但没有农历相关字段,且可能包含额外的字段,如: 1. `week_day`:公历日期对应的星期几,整数类型,1代表周一,7代表周日。 2. ...
我们可以使用`current`属性获取当前系统日历,或者通过`iso8601`、`gregorian`等常量获取其他日历类型。 在实现日历视图时,我们通常会创建一个自定义的日历视图控制器,继承自`UIViewController`。在这个控制器中...
A shell script convert Gregorian calendar into Bongabdo 安装和使用: 'git clone ' 进入目录并授予权限 帮助: bncal -h 孟加拉今天约会: bncal 孟加拉日期在给定的日期,例如。 1952年2月21日 bncal -d 21 ...
支持的日历: gregorian 、 persian 、 arabic 、 indian默认: gregorian 支持的语言环境: en 、 fa 、 ar 、 hi默认值: en NodeJs: 2.0.0 之前的版本 2.0.0 之前的版本输入calendars和locales的方式不同。 ...
1. **公历(Gregorian Calendar)**:也称为格里高利历,是目前国际上普遍采用的标准日历。公历以基督诞生年为公元元年,分为公元前和公元后。公历月份有30天和31天的设定,并有一个闰年的规则,即能被4整除的年份是...
公历(阳历)是指按照地球绕太阳公转一周的周期来计算时间的历法,也称为格里历(Gregorian calendar),以1月1日作为新的一年的开始,以12月31日作为一年的结束。公历有固定的天数,平年为365天,闰年为366天。 ...
$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year); // 初始化日历网格 $calendar = array(); for ($i = 0; $i ; $i++) { $calendar[$i] = array_fill(0, 7, ''); } ``` 然后,我们需要填充日历...