tl;博士
如何查找当前星期几
DayOfWeek.from( LocalDate.now() )
设置一周时间表
LocalDate sunday =
LocalDate.now()
.with( TemporalAdjusters.nextOrSame( DayOfWeek.SUNDAY ) ) ;
LocalDate monday = sunday.plusDays( 1 ) ;
LocalDate tuesday = monday.plusDays( 1 ) ;
…
详情
问题和其他答案都使用过时的类。
旧的日期时间类设计糟糕、混乱且麻烦。避开他们。
java.time
在 Java 8 及更高版本中,我们使用内置的 java.time 框架。大部分功能向后移植到 Java 6 和 7 (ThreeTen-Backport),并进一步适应 Android (ThreeTenABP)。
Instant 表示 UTC 中的当前时刻,分辨率高达纳秒。
Instant instant = Instant.now();
要获得星期几,我们必须确定日期。时区对于确定日期至关重要,因为日期在全球任何特定时刻都可能有所不同。例如,在巴黎午夜过后几分钟是新的一天,而在蒙特利尔仍然是“昨天”。
使用ZoneId 表示时区。要求proper time zone name 格式为continent/region。切勿使用主流媒体中常见的 3-4 个字母缩写,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
使用方便的 DayOfWeek 枚举来确定星期几。
DayOfWeek dow = DayOfWeek.from( zdt );
您可以询问DayOfWeek 对象。
根据ISO 8601 标准,您可以从 1 到 7 使用ask for a number,其中 1 是星期一,7 是星期日。但是不要在你的代码周围传递这个数字;而是传递 DayOfWeek 对象以享受类型安全和保证有效值的好处。
int dowNumber = dow.getValue();
您可能需要文本,即星期几的名称。让 java.time 自动将名称翻译成人类语言。 Locale 是人类语言的种类,还指定了使用的文化规范,例如如何缩写和大写。 TextStyle 枚举表示您想要一个多长的名称。
Locale locale = Locale.CANADA_FRENCH;
String output = dow.getDisplayName( TextStyle.FULL , locale );
要获得一周的开始,请询问上一个星期一(或星期日,等等),或者如果是星期一,请坚持今天。使用TemporalAdjusters 类中的TemporalAdjuster 实现。
LocalDate startOfWeek = zdt.toLocalDate().with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) );
如果您需要日期时间而不是仅日期时间,请让 java.time 获取当天的第一刻(并非总是时间00:00:00)。
ZonedDateTime zdtWeekStart = startOfWeek.atStartOfDay( zoneId );
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。