Java DayOfWeek 枚举
最后修改时间:2025 年 4 月 16 日
java.time.DayOfWeek
枚举表示一周的七天。它是 Java 8 日期和时间 API 的一部分。每个枚举常量都有一个整数值,从 1(星期一)到 7(星期日)。
DayOfWeek
是不可变的且线程安全的。它提供了获取星期几的名称、数值以及执行计算的方法。该枚举遵循 ISO-8601 标准,其中星期一是一周的第一天。
DayOfWeek 枚举概述
DayOfWeek
提供了用于处理星期几的方法。关键操作包括获取值、比较日期和执行算术运算。枚举常量是自描述的,易于使用。
public enum DayOfWeek implements TemporalAccessor, TemporalAdjuster { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; public int getValue(); public String getDisplayName(TextStyle style, Locale locale); public DayOfWeek plus(long days); public DayOfWeek minus(long days); public static DayOfWeek of(int dayOfWeek); public static DayOfWeek from(TemporalAccessor temporal); }
上面的代码显示了 DayOfWeek
提供的主要方法。这些方法允许创建、比较和操作星期几。该枚举遵循国际标准来表示周。
获取 DayOfWeek 常量
可以直接访问 DayOfWeek 常量或从数值创建它们。每个常量对应一个特定的日期,星期一为 1,星期日为 7。这与 ISO-8601 标准匹配。
package com.zetcode; import java.time.DayOfWeek; public class Main { public static void main(String[] args) { // Access enum constants directly DayOfWeek monday = DayOfWeek.MONDAY; System.out.println("Monday: " + monday); // Create from numeric value (1-7) DayOfWeek friday = DayOfWeek.of(5); System.out.println("Friday: " + friday); // Get numeric value of a day int sundayValue = DayOfWeek.SUNDAY.getValue(); System.out.println("Sunday value: " + sundayValue); // Get from LocalDate DayOfWeek today = java.time.LocalDate.now().getDayOfWeek(); System.out.println("Today is: " + today); } }
此示例演示了获取 DayOfWeek 常量的不同方法。输出显示了枚举名称及其数值。of
方法对于 1-7 范围之外的值会抛出异常。
显示星期几的名称
DayOfWeek 通过 getDisplayName
方法提供本地化的显示名称。这对于需要本地化星期几名称的用户界面很有用。style 参数控制缩写长度。
package com.zetcode; import java.time.DayOfWeek; import java.time.format.TextStyle; import java.util.Locale; public class Main { public static void main(String[] args) { DayOfWeek day = DayOfWeek.WEDNESDAY; // Full name in default locale String fullName = day.getDisplayName(TextStyle.FULL, Locale.getDefault()); System.out.println("Full name: " + fullName); // Short name in English String shortName = day.getDisplayName(TextStyle.SHORT, Locale.ENGLISH); System.out.println("Short name: " + shortName); // Narrow name in French String narrowName = day.getDisplayName(TextStyle.NARROW, Locale.FRENCH); System.out.println("Narrow name: " + narrowName); // All styles for Sunday in German DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println("German Sunday:"); System.out.println("FULL: " + sunday.getDisplayName(TextStyle.FULL, Locale.GERMAN)); System.out.println("SHORT: " + sunday.getDisplayName(TextStyle.SHORT, Locale.GERMAN)); System.out.println("NARROW: " + sunday.getDisplayName(TextStyle.NARROW, Locale.GERMAN)); } }
此示例展示了如何在不同的语言环境和样式中显示星期几的名称。TextStyle.FULL 给出完整的名称,SHORT 给出缩写,NARROW 给出最小表示。输出因语言环境设置而异。
日期运算
DayOfWeek 通过 plus
和 minus
方法支持算术运算。这些操作在跨越周界时会环绕。这些方法对于计算未来或过去的日期很有用。
package com.zetcode; import java.time.DayOfWeek; public class Main { public static void main(String[] args) { DayOfWeek wednesday = DayOfWeek.WEDNESDAY; // Add days (wraps around) DayOfWeek nextDay = wednesday.plus(1); System.out.println("Next day: " + nextDay); // Subtract days (wraps around) DayOfWeek previousDay = wednesday.minus(1); System.out.println("Previous day: " + previousDay); // Add multiple weeks (no change) DayOfWeek sameDay = wednesday.plus(14); System.out.println("Two weeks later: " + sameDay); // Complex calculation DayOfWeek result = wednesday.plus(3).minus(10); System.out.println("Complex calculation: " + result); } }
此示例演示了 DayOfWeek 的日期运算。给星期日加 1 天返回星期一,从星期一减去 1 天返回星期日。加上 7 的倍数会返回同一星期几。
比较日期
DayOfWeek 实现了 Comparable 接口,允许按时间顺序比较日期。比较基于其 ISO-8601 顺序(星期一 = 1 到星期日 = 7)。这对于排序或确定日期序列很有用。
package com.zetcode; import java.time.DayOfWeek; public class Main { public static void main(String[] args) { DayOfWeek monday = DayOfWeek.MONDAY; DayOfWeek friday = DayOfWeek.FRIDAY; DayOfWeek sunday = DayOfWeek.SUNDAY; // Compare days System.out.println("Monday before Friday: " + (monday.compareTo(friday) < 0)); System.out.println("Friday after Sunday: " + (friday.compareTo(sunday) > 0)); // Using equals System.out.println("Monday equals Monday: " + monday.equals(DayOfWeek.MONDAY)); // Using == (safe for enums) System.out.println("Friday is Friday: " + (friday == DayOfWeek.FRIDAY)); // Between check DayOfWeek wednesday = DayOfWeek.WEDNESDAY; System.out.println("Wednesday between Monday and Friday: " + (wednesday.compareTo(monday) > 0 && wednesday.compareTo(friday) < 0)); } }
此示例显示了比较 DayOfWeek 值的各种方法。compareTo
方法根据日期顺序返回负数、零或正数。对于相等性,可以使用 equals
或 ==,因为枚举是单例的。
与 TemporalAdjusters 一起使用
DayOfWeek 与 TemporalAdjusters 配合使用,进行复杂的日期计算。这对于查找特定日期(例如“下周二”或“本月最后一个星期五”)很有用。该 API 提供了几个内置的调整器。
package com.zetcode; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; public class Main { public static void main(String[] args) { LocalDate today = LocalDate.now(); System.out.println("Today: " + today); // Next Tuesday LocalDate nextTuesday = today.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); System.out.println("Next Tuesday: " + nextTuesday); // Previous Friday LocalDate lastFriday = today.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY)); System.out.println("Previous Friday: " + lastFriday); // First Monday of next month LocalDate firstMondayNextMonth = today.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)) .plusMonths(1); System.out.println("First Monday next month: " + firstMondayNextMonth); // Last day of current month LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth()); DayOfWeek lastDayOfWeek = lastDay.getDayOfWeek(); System.out.println("Last day of month is: " + lastDayOfWeek); } }
此示例演示了将 DayOfWeek 与 TemporalAdjusters 一起使用。调整器提供了强大的日期操作功能。它们可以找到相对于其他日期的特定日期,同时正确处理月份边界。
使用 DayOfWeek 的 Switch 语句
DayOfWeek 非常适合与 switch 语句一起使用,用于特定于日期的逻辑。枚举常量使代码比使用数值更具可读性。这种模式在业务逻辑实现中很常见。
package com.zetcode; import java.time.DayOfWeek; import java.time.LocalDate; public class Main { public static void main(String[] args) { DayOfWeek today = LocalDate.now().getDayOfWeek(); // Switch on DayOfWeek switch (today) { case MONDAY: System.out.println("Start of work week"); break; case FRIDAY: System.out.println("Almost weekend!"); break; case SATURDAY: case SUNDAY: System.out.println("Weekend!"); break; default: System.out.println("Midweek day"); } // Enhanced switch (Java 12+) String message = switch (today) { case MONDAY -> "Monday blues"; case FRIDAY -> "TGIF!"; case SATURDAY, SUNDAY -> "Weekend vibes"; default -> "Regular work day"; }; System.out.println("Message: " + message); } }
此示例显示了两种在 switch 语句中使用 DayOfWeek 的方法。传统的 switch 适用于所有 Java 版本,而增强的 switch 需要 Java 12+。枚举使代码比数值检查更具表现力。
来源
在本文中,我们介绍了 Java DayOfWeek 枚举的基本方法和特性。理解这些概念对于在现代 Java 应用程序中使用日期和周至关重要。
作者
列出所有Java教程。