Java Calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY),它会向后滚动,转发还是未知?

Wil*_*ill 27 java calendar

假设以下代码在2009年8月22日(星期六)执行

   Calendar c = Calendar.getInstance();
   c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Run Code Online (Sandbox Code Playgroud)

c.get(Calendar.DAY_OF_MONTH) 将返回23.我感兴趣的条件是将返回14(上周日,而不是下周日).

是否有与方向相关的日历将推出的任何规则DAY_OF_MONTH/YEARDAY_OF_WEEK设置?如果是这样,他们是什么?

Vot*_*ple 11

它应始终保持不变WEEK_OF_MONTH(http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#WEEK_OF_MONTH).从文档:

设置或获取WEEK_OF_MONTH或WEEK_OF_YEAR字段时,日历必须将月份或年份的第一周确定为参考点.一个月或一年的第一周定义为从getFirstDayOfWeek()开始并且至少包含该月或年的getMinimalDaysInFirstWeek()天的最早七天.周数在第一周之前编号为......,-1,0; 周数为2,3,......跟随它.请注意,get()返回的规范化编号可能不同.例如,特定的日历子类可以指定一年的第1周之前的一周作为前一年的第n周.


Ale*_*nov 8

以下公式在[0; 6]范围内的一周内返回"当前"日

(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek
Run Code Online (Sandbox Code Playgroud)

如果你想要范围,可以加1 [1; 7]

(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek + 1
Run Code Online (Sandbox Code Playgroud)

d是什么Calendar.get(Calendar.DAY_OF_WEEK)回报

获取一周中的第一天,从当前日期中减去公式的结果.以下代码执行此操作:

final int currentDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 7 - cal.getFirstDayOfWeek()) % 7;
cal.add(Calendar.DAY_OF_YEAR, -currentDayOfWeek);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

使用 java.time

现代方法是使用 java.time 类取代麻烦的旧的遗留日期时间类。

java.time 类更容易使用。特别是,它们消除了问题中提出的歧义。您可以明确要求较早的周日或较晚的周日。

LocalDate级表示没有时间一天和不同时区的日期,唯一的价值。

Month枚举提供了十几个预定义的对象,一个是一年中每个月。这些枚举对象使用起来更安全,但您可以改为使用普通数字表示月份。与传统课程不同,这些月份的编号合理,1-12 月为 1-12。

LocalDate localDate = LocalDate.of( 2009 , Month.AUGUST, 22 );
Run Code Online (Sandbox Code Playgroud)

TemporalAdjuster接口提供对日期时间值的操作。在TemporalAdjusters类(注意是复数s)提供了一些方便的实现。

previousnext调节排除在考虑日期本身。在previousOrSamenextOrSame有关方法返回的日期,如果它确实是需要的某一天的一周。

DayOfWeek枚举提供七个预定义的对象,一个星期中的每一天。

LocalDate previousSunday = localDate.with( TemporalAdjusters.previous ( DayOfWeek.SUNDAY ));
LocalDate previousOrSameSunday = localDate.with( TemporalAdjusters.previousOrSame ( DayOfWeek.SUNDAY ));

LocalDate nextSunday = localDate.with( TemporalAdjusters.next ( DayOfWeek.SUNDAY ));
LocalDate nextOrSameSunday = localDate.with( TemporalAdjusters.nextOrSame ( DayOfWeek.SUNDAY ));
Run Code Online (Sandbox Code Playgroud)

转储到控制台。

System.out.println ("localDate: " + localDate + " ( " + localDate.getDayOfWeek ().getDisplayName ( TextStyle.FULL, Locale.US )  + " )");
System.out.println ("previousSunday: " + previousSunday );
System.out.println ("nextSunday: " + nextSunday );
Run Code Online (Sandbox Code Playgroud)

本地日期:2009-08-22(星期六)

上一个星期日:2009-08-16

下周日:2009-08-23


关于 java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, &SimpleDateFormat

乔达-时间的项目,现在在维护模式,建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


Mic*_*fel 5

实际上,这取决于。考虑以下Java代码。这实际上非常简单,我希望它可以在2011-09-18之前的星期一(即2011-09-12)打印:

Calendar calendar = Calendar.getInstance(Locale.GERMANY);
System.out.printf("First day of week: %d%n%n", calendar.getFirstDayOfWeek());

calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF%n", calendar);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF%n%n", calendar);

calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF (week %d)%n",
        calendar, calendar.get(Calendar.WEEK_OF_YEAR));
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF (week %d)%n", calendar,
        calendar.get(Calendar.WEEK_OF_YEAR));
Run Code Online (Sandbox Code Playgroud)

但实际上结果有些不同:

First day of week: 2

Starting day: 2011-09-18
Last monday: 2011-09-19

Starting day: 2011-09-18 (week 37)
Last monday: 2011-09-12 (week 37)
Run Code Online (Sandbox Code Playgroud)

换句话说,结果取决于我的日历是否知道我可能对该周感兴趣。如果我查询,结果实际上会改变WEEK_OF_YEAR