在 Java 中处理“星期”相关的功能,主要涉及 java.util.Calendar、java.util.Date 以及 Java 8 引入的 java.time 包,下面我将详细介绍如何使用这些类来获取和操作星期信息。

使用 java.util.Calendar (旧版 API)
Calendar 是 Java 8 之前处理日期和时间的主要类,要获取星期信息,可以使用 get() 方法并传入 Calendar 类中定义的常量。
获取星期几 (1-7 或 0-6)
Calendar 提供了两个与星期相关的字段:
Calendar.DAY_OF_WEEK: 表示一个星期中的第几天,它的值取决于Calendar的地区设置。- 在美国等地区(
Locale.US),周日是第一天,值为1;周六是最后一天,值为7。 - 在中国等地区(
Locale.CHINA),周一是第一天,值为1;周日是最后一天,值为7。
- 在美国等地区(
Calendar.DAY_OF_WEEK_IN_MONTH: 表示当前月份中第几个星期几(5月的第二个周五)。
示例代码:
import java.util.Calendar;
import java.util.Locale;
public class CalendarWeekExample {
public static void main(String[] args) {
// 1. 获取一个 Calendar 实例,默认使用当前时间和系统默认地区
Calendar calendar = Calendar.getInstance();
// 2. 获取今天是星期几 (1-7)
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("今天是星期几 (1-7): " + dayOfWeek);
// --- 根据不同地区获取星期名称 ---
// 使用美国地区 (周日为第一天)
calendar = Calendar.getInstance(Locale.US);
dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("在美国地区,今天是星期几 (1-7): " + dayOfWeek);
// 使用中国地区 (周一为第一天)
calendar = Calendar.getInstance(Locale.CHINA);
dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("在中国地区,今天是星期几 (1-7): " + dayOfWeek);
// 3. 将数字转换为星期名称
String[] weekDays = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
// 注意:weekDays[0] 是空的,因为 Calendar.DAY_OF_WEEK 的值从 1 开始
String weekDayName = weekDays[dayOfWeek];
System.out.println("今天是: " + weekDayName);
// 4. 设置特定的日期并获取星期
// 假设我们想查询 2025年10月1日 是星期几
calendar.set(2025, Calendar.OCTOBER, 1); // 月份从0开始,OCTOBER是9
int specificDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("2025年10月1日是: " + weekDays[specificDayOfWeek]);
}
}
输出示例 (假设今天是2025年10月27日,星期五):

今天是星期几 (1-7): 6
在美国地区,今天是星期几 (1-7): 6
在中国地区,今天是星期几 (1-7): 6
今天是: 星期五
2025年10月1日是: 星期日
使用 java.time (Java 8+ 新版 API)
从 Java 8 开始,官方推荐使用 java.time 包中的类,它们更现代、更易用,并且是不可变的,核心类是 LocalDate。
java.time 中的星期定义是国际标准 (ISO-8601),即:
- 周一为第一天,值为
1。 - 周日为最后一天,值为
7。 这个定义是固定的,不受地区设置影响,更加清晰。
获取星期几 (1-7)
使用 LocalDate 的 getDayOfWeek() 方法会返回一个 DayOfWeek 枚举对象,这比直接使用数字更安全、更具可读性。
示例代码:

import java.time.DayOfWeek;
import java.time.LocalDate;
public class JavaTimeWeekExample {
public static void main(String[] args) {
// 1. 获取当前日期
LocalDate today = LocalDate.now();
// 2. 获取 DayOfWeek 枚举
DayOfWeek dayOfWeek = today.getDayOfWeek();
// 3. 从枚举中获取星期几的数字 (1-7, 周一为1)
int dayOfWeekValue = dayOfWeek.getValue();
// 4. 从枚举中获取星期几的名称
String dayOfWeekName = dayOfWeek.toString(); // "FRIDAY"
String displayName = dayOfWeek.getDisplayName(java.time.format.TextStyle.FULL, java.util.Locale.CHINA); // "星期五"
System.out.println("今天是: " + today);
System.out.println("今天是星期几 (枚举): " + dayOfWeek);
System.out.println("今天是星期几 (数字 1-7): " + dayOfWeekValue);
System.out.println("今天是星期几 (英文名称): " + dayOfWeekName);
System.out.println("今天是星期几 (中文全称): " + displayName);
// 5. 设置特定的日期并获取星期
LocalDate specificDate = LocalDate.of(2025, 10, 1);
DayOfWeek specificDayOfWeek = specificDate.getDayOfWeek();
System.out.println("2025年10月1日是: " + specificDayOfWeek.getDisplayName(java.time.format.TextStyle.FULL, java.util.Locale.CHINA));
}
}
输出示例:
今天是: 2025-10-27
今天是星期几 (枚举): FRIDAY
今天是星期几 (数字 1-7): 5
今天是星期几 (英文名称): FRIDAY
今天是星期几 (中文全称): 星期五
2025年10月1日是: 星期日
总结与对比
| 特性 | java.util.Calendar |
java.time.LocalDate |
|---|---|---|
| 版本 | Java 1.1 及以后 | Java 8 及以后 (推荐) |
| 星期定义 | 受地区影响 (Locale) | 固定标准 (ISO-8601,周一为1) |
| 获取方式 | calendar.get(Calendar.DAY_OF_WEEK) |
localDate.getDayOfWeek() |
| 返回类型 | int (1-7 或 0-6) |
DayOfWeek 枚举 |
| 优点 | 旧版Java兼容 | 不可变、线程安全、API清晰、功能强大 |
| 缺点 | 可变、线程不安全、API笨重、易出错 | - |
- 如果你使用的是 Java 8 或更高版本,强烈推荐使用
java.time.LocalDate和DayOfWeek枚举,它更直观、更安全,并且避免了Calendar的地区陷阱。 - 如果你必须在旧版 Java (Java 7 或更早) 环境中工作,那么你只能使用
java.util.Calendar,在使用时,请务必注意DAY_OF_WEEK的值会根据Locale而改变,最好显式指定一个你熟悉的Locale(如Locale.US或Locale.CHINA) 以避免混淆。
