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

Kje*_*din 4 java calendar date 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));
Run Code Online (Sandbox Code Playgroud)

输出是:

2013年1月7日

2

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

ppe*_*rka 12

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

  • 月份从0开始(1月)
  • 一周的几天从SUNDAY1 开始,SATURDAY是7(Ideone小提琴)
  • c.setFirstDayOfWeek(Calendar.MONDAY); 与名称暗示的有点不同

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

您可以通过始终使用Calendar类中定义的常量来解决问题,甚至不尝试从这些常量的数值表示推断出任何含义,或者Calendar.get(int)方法返回的结果......


Jon*_*eet 10

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

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

尽管如此,任何涉及本周开始的计算都应该使用getFirstDayOfWeek.