java 日历 setFirstDayOfWeek 不工作

java Calendar setFirstDayOfWeek not working

现在是真正的日历:

   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_WEEK2015/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 周的第一天?

cal.get(Calendar.DAY_OF_WEEK) 会 return 您指定的日期是哪一天(星期日、星期一等)。所以它会 return 你星期二然后是 3,无论一周的第一天是什么。这与setFirstDayOfWeek方法无关。

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

setFirstDayOfWeek 只是告诉日历哪一天被认为是第一天,即星期日或星期一或任何其他日子。它不会更改任何任意日期的星期几。此方法的 javadoc 说明如下:

public void setFirstDayOfWeek(int value)

设置一周的第一天;例如,U.S 中的星期日,法国中的星期一。

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

tl;博士

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

避免遗留日期时间 classes

Calendar 和它的兄弟 classes 一样,一团糟。幸运的是,这些旧的日期时间 classes 现在是遗留的,被 java.time classes 取代。

ISO 8601

如果您希望星期一作为一周的第一天,星期日作为最后一天,编号为 1-7,则使用 java.time class 中默认使用的 ISO 8601 日历es。

DayOfWeek

DayOfWeek 枚举为一周中的每个 ISO 天保留预定义对象。如果需要,您可以查询它的编号,但通常传递此枚举的对象而不是仅仅传递整数更好。

LocalDate

LocalDate class 表示没有时间和时区的仅日期值。

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 class。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP 项目专门为 Android 改编 ThreeTen-Backport(如上所述)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.