0 0

Calendar怎么了10

今天,应该说是本周,Calendar认为是2008年第一周
Calendar calendar = Calendar.getInstance();
Integer currYear = calendar.get(Calendar.YEAR);
Integer currWeekno = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println(currYear+":"+currWeekno);
打印结果居然是2008:1
咋办
SOA 
2008年12月29日 14:23

6个答案 按时间排序 按投票排序

0 0

打错了,2028年是有54周,输出为53周

2008年12月30日 20:21
0 0

输出为1可能是因为算的时候得到的是第53周(这个时候把第一周算了近来),但是通过getActualMaximum(Calendar.WEEK_OF_YEAR)得到的是52(理由前面同上),由于53 > 52,所以被视为2009年的第一周了。(其实闰年可以出54周的,例如2028年的第一天是星期6,最后一天是星期天,如果按默认的星期天为第一天的话,有53周,但是最后一天2028.12.31的星期数为1,即2029年的第一个星期)

2008年12月30日 20:20
0 0

刚才就这个问题看了下JDK1.6的实现,发现在计算week of year时使用的方法很奇怪,所以稍微研究了下,大致如下

首先做了下测试,如果把代码改为如下

        Calendar calendar = Calendar.getInstance();
	calendar.setMinimalDaysInFirstWeek(5);
	calendar.setTimeInMillis(System.currentTimeMillis());
	Integer currYear = calendar.get(Calendar.YEAR);
	Integer currWeekno = calendar.get(Calendar.WEEK_OF_YEAR);
	
	System.out.println(currYear+":"+currWeekno); 
	System.out.println(calendar.getActualMaximum(Calendar.WEEK_OF_YEAR));


输出的结果是
  2008:53
  53


如果去掉2,3行,结果和楼主一样,同时可以看到今年实际的星期数为52

查看了下代码,发现getActualMaximum(Calendar.WEEK_OF_YEAR)的部分代码如下:
源代码 (GregorianCalendar.class,默认生成的是这个)
    // Get the day of week of January 1 of the year
    CalendarDate d = cal.newCalendarDate(TimeZone.NO_TIMEZONE);
    d.setDate(date.getYear(), BaseCalendar.JANUARY, 1);
    int dayOfWeek = cal.getDayOfWeek(d);
    // Normalize the day of week with the firstDayOfWeek value
    dayOfWeek -= getFirstDayOfWeek();
    if (dayOfWeek < 0) {
	dayOfWeek += 7;
    }
    value = 52;
    int magic = dayOfWeek + getMinimalDaysInFirstWeek() - 1;
    if ((magic == 6) ||
	(date.isLeapYear() && (magic == 5 || magic == 12))) {
	value++;
    }

实际的星期数是52还是53其实最关键的在最后的if能不能进去了,这个magic number的计算方式很特别:
第一个dayofweek是指的今年的第一天是星期几,如2008年1月1号星期2,所以是2;
第二个getMinimalDaysInFirstWeek()是一个可以设定的参数,意思是一个星期至少要有多少天,默认为1。
也就是说如果某年的第一天是星期6,那么这个星期只有一天属于这一年,如果getMinimalDaysInFirstWeek()刚好为1,java calendar就认为这个星期为这一年的第一个星期,如果getMinimalDaysInFirstWeek()大于1,则这个星期被忽略,从下个星期开始算做这一年的第一个星期。

if语句的条件是magic == 6, 为什么必须为6呢,我猜想可能是这样的:

一年一般为365(非闰年),那么至少有51(7*51 = 357)个星期是完整的属于这一年,还有最后的8天分为最前和最后两个星期,由于最后一周好象不记多少天都算了一周,所以如果第一周算进来就有53周,否则只有52周
假设第一个星期在本年内有x天,则最后一个星期有8-x天,可以推出:
dayofweek = 7 - x
要满足 magic = dayofweek + getMinimalDaysInFirstWeek() - 1 = 6,只能是
getMinimalDaysInFirstWeek() = x
即第一个星期的实际天数刚好是一个星期的最少天数

所以上面的程序把MinimalDaysInFirstWeek改为了5天(2008.1.1为星期2,有5天在2008年内),然后一定要重新设置时间值以触发calendar重新计算fields数组(记录各项时间值的一个数组),这样结果就是2008年实际有53周,今天(2008.12.30)是第53周

现在还没有明白为什么必须是相等,为什么不是小于呢,即如果第一个星期的实际天数大于要求的每星期最少天数,则当年有53周,当然这样默认值算出来的每年至少有53周了

尝试了下把上面的代码中MinimalDaysInFirstWeek改成了6,然后输出今年的第一天的星期数
    calendar.set(2008, 0, 1);
    System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));

呵呵,结果是53,因为刚好2007年的getActualMaximum(Calendar.WEEK_OF_YEAR)在这种情况下为53
如果改为7,则输出52,都被算做2007年的最后一个星期了
如果改为5以下,则输出为1,即当做了2008年的第一个星期

最后还是没有回答为什么要这样计算,只是说解释了为什么输出是1而不是53了
谁能帮忙解释下关于这个星期算法的原理就好

2008年12月30日 20:05
0 0

晕是2009年的第一周

2008年12月30日 00:45
0 0

calendar.get(Calendar.WEEK_OF_YEAR); 

请用下面代码代替
calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);


应为本周即是2008年的最后一周,又是2009年的最后一周,jdk对get方法故意这样,应该是啥标准决定的,还有的方法是:

calendar.getActualMinimum(Calendar.WEEK_OF_YEAR);

2008年12月30日 00:45
0 0

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DATE, 1);
        int currYear = calendar.get(Calendar.YEAR);
        int currWeekno = calendar.get(Calendar.WEEK_OF_YEAR);
        System.out.println(currYear + ":" + currWeekno);

        试试

2008年12月29日 15:49

相关推荐

    Java 之 Date 和 Calendar 实例

    在Java编程语言中,`Date`和`Calendar`类是处理日期和时间的核心组件。这两个类在不同的Java版本中有着不同的使用方式和功能,对于理解Java时间处理机制至关重要。本篇将深入探讨`Date`和`Calendar`类的实例应用。 ...

    ASP.NET Calendar如何给每天添加日志

    ASP.NET Calendar日志添加方法 ASP.NET Calendar控件是ASP.NET中常用的日历控件,用于显示日期和事件信息。然而,在实际应用中,我们经常需要对每天添加日志信息,以便更好地记录和管理事件。本文将详细介绍如何...

    simplecalendar.js记录事件的日历插件

    《深入解析simplecalendar.js:构建记录事件的日历插件》 在现代网页设计中,日历插件已经成为不可或缺的一部分,它能帮助用户直观地管理时间安排和事件记录。"simplecalendar.js"是一款轻量级、易用且功能丰富的...

    漂亮的jQuery事件日历插件calendar.js

    **jQuery事件日历插件calendar.js详解** 在网页设计中,日历插件是一个非常实用的元素,尤其在处理日期相关的交互时。"漂亮的jQuery事件日历插件calendar.js"正是这样一个工具,它能帮助开发者轻松地在网页上集成...

    Calendar日期代码详解

    根据提供的文件信息,本文将对Java中的`Calendar`类进行详细的解析,并且通过示例代码进一步阐述其在日期与时间处理中的应用。 ### Calendar日期代码详解 #### 1. Calendar 类简介 `java.util.Calendar` 类是 ...

    Active Desktop Calendar 7.95 简体中文汉化补丁

    《Active Desktop Calendar 7.95 简体中文汉化补丁详解及应用》 Active Desktop Calendar是一款功能强大的桌面日历软件,以其便捷性和实用性深受用户喜爱。然而,对于中文用户来说,英文界面可能会带来一定的操作...

    ext js calendar 日历

    Ext JS Calendar 日历是一款强大的日历控件,适用于构建具有丰富功能的日程管理应用。它提供了多种视图,包括月视图、日视图和周视图,允许用户灵活查看和管理时间安排。本文将深入探讨Ext JS Calendar的核心组件、...

    基于Vue2-Calendar改进的日历组件(含中文使用说明)

    本文将详细介绍一个基于Vue2-Calendar组件进行改进的日历组件,该组件在原版基础上进行了多项优化,以满足更多样化的使用需求。首先,让我们了解一下Vue2-Calendar的基础知识。 Vue2-Calendar是一款适用于Vue.js...

    JAVA LunarCalendar返回农历(阴历)日期 JAR包 有包括详细DOC文档

    LunarCalendar返回农历(阴历)日期的JAR包 根据指定日期计算对应农历日期(这个计算方法是网上找的,最初的作者是谁已经无法考证了,感谢网络资源吧!),本人封装成好用的JAR包后发不出来,供大家免费下载! ...

    WebCalendar网页日历控件(js,javascript)

    WebCalendar是一款基于JavaScript的网页日历控件,它允许用户在网页上方便地选择和操作日期,极大地提升了用户在网页上的交互体验。这个控件主要适用于那些需要在网页上进行日期输入或者事件管理的应用,例如在线...

    calendar选择时间控件,绝对好用

    本文将深入探讨“calendar选择时间控件”的实现及其特点,以满足用户对于日期和时间输入的需求。 首先,一个优秀的calendar时间控件需要提供直观、易用的界面,使用户能够方便快捷地选取日期或日期与时间。正如标题...

    C#自定义控件Calendar、DatePicker样式

    标题"**C#自定义控件Calendar、DatePicker样式**"表明了这个项目的目标是通过C#编程语言,对WPF的内置`Calendar`和`DatePicker`控件进行样式定制。这通常涉及到修改控件的模板,如边框、背景、字体大小、颜色等,以...

    日历插件calendar.js

    《calendar.js:构建高效日历插件的指南》 在当今的Web开发中,日历插件已经成为不可或缺的一部分,尤其在处理与日期相关的任务时。本文将深入探讨名为"calendar.js"的JavaScript日历插件,它允许用户轻松地设置...

    jscalendar-1.0

    &lt;script type=\"text/javascript\" src=\"&lt;%=ctx%&gt;/js/calendar/calendar.js\"&gt; &lt;script type=\"text/javascript\" src=\"&lt;%=ctx%&gt;/js/calendar/calendar-zh.js\"&gt; ...

    gnome-calendar 农历 ics 文件

    gnome-calendar是一款开源桌面环境Gnome中的日历应用,它提供了直观的日程管理功能,包括查看日期、安排事件、设置提醒等。对于中国用户来说,除了公历日期外,农历的显示也是非常重要的一项功能。本篇文章将深入...

    Qt-Qml-Calendar_qml_QT_qml日历控件_calendar_

    标题"Qt-Qml-Calendar_qml_QT_qml日历控件_calendar_"指的是一个专门用于创建日历组件的QML项目。这个项目可能包含了完整的源代码、示例和文档,帮助开发者快速理解和应用QML日历控件到他们的Qt应用程序中。 描述中...

    PyPI 官网下载 | LunarCalendar-0.0.9.tar.gz

    《PyPI官网下载 | LunarCalendar-0.0.9.tar.gz——深入了解Python农历库》 在Python的世界里,丰富的第三方库是其强大功能的重要组成部分。本文将深入探讨一个名为"LunarCalendar"的Python库,该库可以从PyPI...

    jquery-week-calendar-master日历控件

    《jQuery Week Calendar控件:构建在线日程管理应用》 在Web开发中,日历控件是不可或缺的一部分,尤其对于需要处理时间安排和任务管理的应用来说。jQuery Week Calendar控件是一个强大而灵活的解决方案,它使得...

    前端项目-tui-calendar.zip

    【标题】"前端项目-tui-calendar.zip"是一个包含前端日历组件源代码的压缩包,主要涉及的是"TOAST UI Calendar"。这个组件是TOAST UI系列产品的一部分,它为Web应用提供了灵活且功能丰富的日历功能。 【描述】"前端...

    jquery calendar.js日历选择控件带节日日历选择器

    `jQuery Calendar.js`是一款基于JavaScript库`jQuery`的插件,用于实现日历选择功能,同时它具有节日显示的功能,增强了用户体验。这个控件能够帮助用户在网页上方便地选择日期,常见于在线预订系统、事件安排或者...

Global site tag (gtag.js) - Google Analytics