- 传统的
java.util.Calendar类 (已过时,但可能在旧代码中见到) - 现代的
java.time包 (Java 8 及以上版本推荐使用)
下面我将分别详细介绍这两种方式,并提供代码示例。
传统方式:java.util.Calendar (已过时)
Calendar 类是 Java 8 之前处理日期和时间的核心类,它使用一个整数常量来表示星期,这个整数是基于美国的习惯,周日是第一天,周六是最后一天。
星期常量
| 常量 | 值 | 描述 |
|---|---|---|
Calendar.SUNDAY |
1 | 星期日 |
Calendar.MONDAY |
2 | 星期一 |
Calendar.TUESDAY |
3 | 星期二 |
Calendar.WEDNESDAY |
4 | 星期三 |
Calendar.THURSDAY |
5 | 星期四 |
Calendar.FRIDAY |
6 | 星期五 |
Calendar.SATURDAY |
7 | 星期六 |
获取当前是星期几
get() 方法用于获取 Calendar 实例的某个字段值。
import java.util.Calendar;
public class CalendarExample {
public static void main(String[] args) {
// 1. 获取一个 Calendar 实例,默认是当前时间
Calendar calendar = Calendar.getInstance();
// 2. 获取星期几 (返回一个整数,1=周日, 2=周一, ..., 7=周六)
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("今天是星期: " + dayOfWeek); // 输出类似: 今天是星期: 5 (代表星期四)
// 3. 将整数转换为对应的星期名称
String weekDayName;
switch (dayOfWeek) {
case Calendar.SUNDAY:
weekDayName = "星期日";
break;
case Calendar.MONDAY:
weekDayName = "星期一";
break;
case Calendar.TUESDAY:
weekDayName = "星期二";
break;
case Calendar.WEDNESDAY:
weekDayName = "星期三";
break;
case Calendar.THURSDAY:
weekDayName = "星期四";
break;
case Calendar.FRIDAY:
weekDayName = "星期五";
break;
case Calendar.SATURDAY:
weekDayName = "星期六";
break;
default:
weekDayName = "未知";
break;
}
System.out.println("今天是: " + weekDayName); // 输出: 今天是: 星期四
}
}
注意:Calendar 类是可变的,并且设计上存在一些问题,因此在现代 Java 开发中不推荐使用。
现代方式:java.time 包 (推荐)
Java 8 引入了全新的 java.time 包,它提供了更强大、更直观、更不可变的日期和时间 API,这是处理日期和时间的首选方式。
java.time 中,java.time.DayOfWeek 枚举专门用来表示星期,它遵循国际标准 ISO-8601,即周一是一周的第一天 (Day 1),周日是最后一天 (Day 7)。
DayOfWeek 枚举
| 枚举常量 | 值 | 描述 |
|---|---|---|
DayOfWeek.MONDAY |
1 | 星期一 |
DayOfWeek.TUESDAY |
2 | 星期二 |
DayOfWeek.WEDNESDAY |
3 | 星期三 |
DayOfWeek.THURSDAY |
4 | 星期四 |
DayOfWeek.FRIDAY |
5 | 星期五 |
DayOfWeek.SATURDAY |
6 | 星期六 |
DayOfWeek.SUNDAY |
7 | 星期日 |
获取当前是星期几
import java.time.DayOfWeek;
import java.time.LocalDate;
public class DayOfWeekExample {
public static void main(String[] args) {
// 1. 获取当前日期 (不包含时间)
LocalDate today = LocalDate.now();
// 2. 获取 DayOfWeek 枚举
DayOfWeek dayOfWeek = today.getDayOfWeek();
System.out.println("今天是: " + dayOfWeek); // 输出类似: 今天是: THURSDAY
// 3. 获取星期几的整数值 (ISO-8601标准: 1=周一, 7=周日)
int dayValue = dayOfWeek.getValue();
System.out.println("今天是星期: " + dayValue); // 输出: 今天是星期: 4 (代表星期四)
// 4. 获取中文的星期名称
String weekDayNameInChinese = getChineseDayName(dayOfWeek);
System.out.println("今天是: " + weekDayNameInChinese); // 输出: 今天是: 星期四
}
/**
* 将 DayOfWeek 枚举转换为中文星期名称
*/
public static String getChineseDayName(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
return "星期一";
case TUESDAY:
return "星期二";
case WEDNESDAY:
return "星期三";
case THURSDAY:
return "星期四";
case FRIDAY:
return "星期五";
case SATURDAY:
return "星期六";
case SUNDAY:
return "星期日";
default:
return "未知";
}
}
}
DayOfWeek 的其他常用方法
DayOfWeek 枚举本身也提供了一些非常方便的方法。
import java.time.DayOfWeek;
import java.time.LocalDate;
public class DayOfWeekMethodsExample {
public static void main(String[] args) {
DayOfWeek day = LocalDate.now().getDayOfWeek();
// 1. 获取星期几的整数值 (1-7)
System.out.println("整数值: " + day.getValue()); // e.g., 4
// 2. 获取英文全名
System.out.println("英文全名: " + day.name()); // e.g., THURSDAY
System.out.println("英文格式化: " + day.toString()); // e.g., THURSDAY
// 3. 获取英文缩写
System.out.println("英文缩写: " + day.getDisplayName(java.time.format.TextStyle.SHORT, java.util.Locale.US)); // e.g., Thu
// 4. 计算加减天数
DayOfWeek previousDay = day.minus(1); // 昨天
DayOfWeek nextDay = day.plus(1); // 明天
System.out.println("昨天是: " + previousDay); // e.g., WEDNESDAY
System.out.println("明天是: " + nextDay); // e.g., FRIDAY
// 5. 判断是否是周末
boolean isWeekend = day == DayOfWeek.SATURDAY || day == DayOfWeek.SUNDAY;
System.out.println("今天是周末吗? " + isWeekend); // e.g., false
// 6. 判断是否是工作日
boolean isWeekday = !isWeekend;
System.out.println("今天是工作日吗? " + isWeekday); // e.g., true
}
}
总结与对比
| 特性 | java.util.Calendar |
java.time.DayOfWeek |
|---|---|---|
| API 来源 | Java 1.1 | Java 8 |
| 推荐度 | 不推荐 (已过时) | 强烈推荐 |
| 星期定义 | 周日为第一天 (1-7) | 周一为第一天 (1-7) (ISO-8601 标准) |
| 数据类型 | 整数 (int) |
枚举 (DayOfWeek) |
| 可变性 | 可变,线程不安全 | 不可变,线程安全 |
| 功能 | 基础功能 | 功能丰富,提供加减、判断等方法 |
| 代码可读性 | 较差 (如 Calendar.THURSDAY) |
优秀 (如 DayOfWeek.THURSDAY) |
对于任何新的 Java 项目,请务必使用 java.time 包,它更符合现代编程习惯,功能更强大,能避免很多旧 API 的陷阱,如果你正在维护旧的代码,你可能会遇到 Calendar,但在新功能开发中,应该用 java.time 来替代它。
