为什么我的GregorianCalendar对象返回错误的星期几?

时间:2013-10-02 11:50:18

标签: java date calendar gregorian-calendar

我的问题似乎非常简单。我从GregorianCalendar对象创建一个日历图形用户界面,并使用它的方法计算不同月份的正确天数,以及不同日期的相应工作日。

但工作日有一天休息。日历声称2013年7月1日是'2',这在我的世界意味着星期二。星期一应该是'1'。 “简单!”我想,并把它放在一行:c.setFirstDayOfWeek(Calendar.MONDAY);但没有给出任何反应。

所以我搜索stackoverflow以获得答案,但是每个有问题的人似乎都忘记了1月是0,而不是1.我没有。所以现在我被卡住了。

作为一个简化的代码,我创建了一个非常短的代码片段,它具有相应的输出:

    GregorianCalendar c = new GregorianCalendar();
    c.setFirstDayOfWeek(Calendar.MONDAY);
    c.set(Calendar.MONTH, 6);
    c.set(Calendar.DAY_OF_MONTH, 1);
    c.set(Calendar.YEAR, 2013);

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-YYYY");
    System.out.println(sdf.format(c.getTime()));
    System.out.println(c.get(Calendar.DAY_OF_WEEK));

,输出为:

2013年1月7日

2

我拒绝在我的代码中输入“-1”,错误地纠正了显然是错误的症状。感谢帮助。

3 个答案:

答案 0 :(得分:12)

是的,Java中的日期处理有问题......

  • 月份从0开始(1月)
  • 一周中的几天从SUNDAY开始,SATURDAY为七(Ideone fiddle
  • c.setFirstDayOfWeek(Calendar.MONDAY);与名称暗示有点不同

      

    一个月或一年的第一周定义为从getFirstDayOfWeek()开始并且至少包含该月或年的getMinimalDaysInFirstWeek()天的最早七天期间

您可以使用Calendar类中定义的常量始终来摆脱麻烦,甚至不尝试从这些常量的数值表示中推导出任何含义,Calendar.get(int)方法返回的结果......

答案 1 :(得分:10)

  

我拒绝在我的代码中输入“-1”,错误地纠正了显然是错误的症状。

错误是您假设Calendar.get(Calendar.DAY_OF_WEEK)已本地化。事实并非如此。星期几和号码之间的映射是固定的;如果需要,使用Calendar.getFirstDayOfWeek()来确定人们对“一周中的第一天”的理解;如果您真的想要向用户显示“2”,我会感到惊讶...当然,您希望向他们展示一周中某天的名称

涉及本周开头的任何计算应使用getFirstDayOfWeek

答案 2 :(得分:1)

这是Java中的一个警告,

DAY_OF_WEEK,

  

此字段取值SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,   星期五和星期六。

当你的程序打印2时,它告诉你星期几是星期一。这个常数值与本周开始无关。如果一周的第一天是SUNDAY,它恰巧恰好与星期几相同 - 但如果重新定义了一周的第一天,它就不会改变。