ZetCode

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 标准匹配。

Main.java
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 参数控制缩写长度。

Main.java
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 通过 plusminus 方法支持算术运算。这些操作在跨越周界时会环绕。这些方法对于计算未来或过去的日期很有用。

Main.java
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)。这对于排序或确定日期序列很有用。

Main.java
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 提供了几个内置的调整器。

Main.java
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 语句一起使用,用于特定于日期的逻辑。枚举常量使代码比使用数值更具可读性。这种模式在业务逻辑实现中很常见。

Main.java
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 DayOfWeek 枚举的基本方法和特性。理解这些概念对于在现代 Java 应用程序中使用日期和周至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,在这个领域拥有多年的经验。我从 2007 年开始撰写编程文章,此后撰写了 1400 多篇文章和 8 本电子书。凭借超过 8 年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程