假设以下代码在2009年8月22日(一个星期六)执行
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);c.get(Calendar.DAY_OF_MONTH)将返回23。我对返回14的条件感兴趣(上周日,而不是下周日)。
在设置DAY_OF_WEEK时,是否有与日历滚动DAY_OF_MONTH/YEAR的方向相关的规则?如果有,它们是什么?
发布于 2009-08-23 20:34:55
它应该始终保持相同的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()返回的规范化编号可能不同。例如,特定的日历子类可以将一年的第一周的前一周指定为前一年的第n周。
发布于 2009-12-14 20:35:03
下面的公式返回一周中的“当前”天,范围为0;6
(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek或者,如果您喜欢范围1,则添加1;7
(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek + 1Calendar.get(Calendar.DAY_OF_WEEK)返回的是d
要获得一周的第一天,请从当前日期减去公式的结果。下面的代码可以做到这一点:
final int currentDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 7 - cal.getFirstDayOfWeek()) % 7;
cal.add(Calendar.DAY_OF_YEAR, -currentDayOfWeek);发布于 2017-03-27 16:03:06
使用java.time
现代的方法是使用java.time类,它取代了麻烦的旧遗留日期-时间类。
使用java.time类要容易得多。特别是,它们消除了问题中提出的歧义。您可以明确要求更早的周日或更晚的周日。
LocalDate类表示不带时间和时区的仅日期值。
Month枚举提供了12个预定义的对象,一年中的每个月一个。这些枚举对象使用起来更安全,但是您也可以使用一个普通的月份数字。与传统的课程不同,这些月份有合理的编号,1-12表示1-12月。
LocalDate localDate = LocalDate.of( 2009 , Month.AUGUST, 22 );TemporalAdjuster接口提供对日期-时间值的操作。TemporalAdjusters类(注意复数s)提供了几个方便的实现。
previous & next调节器将日期本身排除在考虑之外。如果日期确实是所需的星期几,则previousOrSame & nextOrSame方法将返回相关日期。
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 ));转储到控制台。
System.out.println ("localDate: " + localDate + " ( " + localDate.getDayOfWeek ().getDisplayName ( TextStyle.FULL, Locale.US ) + " )");
System.out.println ("previousSunday: " + previousSunday );
System.out.println ("nextSunday: " + nextSunday );localDate: 2009-08-22 (星期六)
previousSunday: 2009-08-16
nextSunday: 2009-08-23
关于java.time
java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
现在在maintenance mode中的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle Tutorial。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
从哪里获取java.time类?
中的
适用于安卓specifically.
的
项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和more。
https://stackoverflow.com/questions/1319473
复制相似问题