假设以下代码在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/YEAR时DAY_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周.
以下公式在[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)
现代方法是使用 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)提供了一些方便的实现。
在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 ));
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 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, &SimpleDateFormat。
该乔达-时间的项目,现在在维护模式,建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
从哪里获得 java.time 类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如Interval,YearWeek,YearQuarter,和更多。
实际上,这取决于。考虑以下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!
| 归档时间: |
|
| 查看次数: |
48820 次 |
| 最近记录: |