java Calendar setFirstDayOfWeek不工作

时间:2015-03-24 07:36:46

标签: java calendar

现在是真实日历:

   March 2015       
Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30 31   

我得DAY_OF_WEEK 2015/3/24这样:

public class TestCalendar {
    public static void main(String[] argvs){
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.set(2015,Calendar.MARCH,24);
        System.out.println(cal.get(Calendar.DAY_OF_WEEK));
    }
}

由于我有cal.setFirstDayOfWeekMONDAY,我期望的结果是2,但无论我设置为first day of week的哪一天(已尝试过SUNDAY和其他人)。显示相同的结果3。所以firstDayOfWeek似乎不会影响结果。

我做错了吗?


修改

我刚才想到并感谢下面的答案,这setFirstDayOfWeek不会影响get(Calendar.DAY_OF_WEEK)get(Calendar.WEEK_OF_YEAR)的结果

那么这个方法setFirstDayOfWeek()是为什么设计的? 我的意思是我如何告诉程序我希望2015/3/29成为第12周的最后一天,而不是将其视为第13周的第一天?

3 个答案:

答案 0 :(得分:2)

cal.get(Calendar.DAY_OF_WEEK)将返回给定日期的当天(星期日,星期一等)。因此无论一周的第一天是什么,它都将返回星期二然后是3。这与setFirstDayOfWeek方法无关。

如果您想计算自本周开始以来的天数,您只需使用getFirstDayOfWeek获取一周的第一天并进行一些简单的数学运算。

答案 1 :(得分:1)

TL;博士

LocalDate.of( 2015 , Month.MARCH , 24 )  // `LocalDate` object for 2015-03-24.
         .getDayOfWeek()                 // DayOfWeek.TUESDAY constant object
         .getValue()                     // 2

避免遗留日期时间类

Calendar是一个丑陋的混乱,它的兄弟级别也是如此。幸运的是,这些旧的日期时间类现在已经遗留下来,取而代之的是java.time类。

ISO 8601

如果您希望星期一作为一周的第一天,星期日是最后一个,编号为1-7,那么请使用java.time类中默认使用的ISO 8601日历。

DayOfWeek

DayOfWeek枚举为每周的ISO日期保留预定义对象。如果需要,你可以查询它的数字,尽管通常更好地传递这个枚举的对象而不仅仅是整数。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate ld = LocalDate.of( 2015 , Month.MARCH , 24 );
DayOfWeek dow = ld.getDayOfWeek();
int value = dow.getValue(); // 1-7 for Monday-Sunday. But often better to use the `DayOfWeek` object rather than a mere integer number.

要使用星期一不是第一天的一周的其他定义,请参阅WeekFields课程。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

setFirstDayOfWeek只是告诉日历哪一天被视为第一天,即星期日或星期一或任何其他日子。任何日期都不会改变dayOfWeek。此方法的javadoc指出以下内容:

public void setFirstDayOfWeek(int value)

设定一周的第一天是什么;例如,美国的星期日,法国的星期一。

参数:     价值 - 给定的一周的第一天。