在Java编程中,获取并输出星期几是常见的需求,无论是用于日志记录、日期显示还是业务逻辑处理,Java提供了多种方式来实现这一功能,从传统的Date和Calendar类到现代的java.time包,每种方法都有其适用场景和特点,本文将详细介绍几种主流的实现方式,帮助开发者根据实际需求选择最合适的方案。

使用java.util.Date和java.text.SimpleDateFormat(传统方式)
在Java 8之前,Date和Calendar是处理日期的核心类,虽然Date类本身不直接提供获取星期的方法,但结合SimpleDateFormat可以轻松实现。SimpleDateFormat是一个强大的日期格式化工具,支持自定义日期模式,E”代表星期的缩写(如“Mon”),“EEEE”代表完整星期名称(如“Monday”)。
示例代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class GetDayOfWeek {
public static void main(String[] args) {
Date date = new Date(); // 获取当前日期
SimpleDateFormat sdf = new SimpleDateFormat("E"); // 使用“E”模式获取星期缩写
String dayOfWeek = sdf.format(date);
System.out.println("今天是星期:" + dayOfWeek);
// 获取完整星期名称
sdf.applyPattern("EEEE");
System.out.println("今天是星期:" + sdf.format(date));
}
}
注意事项:
Date类已被标记为过时(@Deprecated),官方推荐使用java.time包中的类。SimpleDateFormat不是线程安全的,在多线程环境下需注意同步问题。
使用java.util.Calendar类(传统方式)
Calendar类提供了更丰富的日期操作方法,可以直接获取星期的数值(Calendar.DAY_OF_WEEK),需要注意的是,Calendar中星期从周日开始(1=周日,2=周一,…,7=周六)。

示例代码:
import java.util.Calendar;
public class GetDayOfWeekWithCalendar {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
String[] weekDays = {"", "周日", "周一", "周二", "周三", "周四", "周五", "周六"};
System.out.println("今天是星期:" + weekDays[dayOfWeek]);
}
}
优化建议:
- 可以通过数组映射将数值转换为中文星期名称,提高代码可读性。
Calendar类同样存在线程安全问题,且API设计较为繁琐,不推荐在新项目中使用。
使用java.time包(Java 8+推荐方式)
Java 8引入了全新的java.time包,彻底解决了旧日期时间API的诸多问题,其中LocalDate类表示不带时区的日期,而DayOfWeek枚举则提供了星期的相关信息。
获取当前星期几
import java.time.DayOfWeek;
import java.time.LocalDate;
public class GetDayOfWeekWithJavaTime {
public static void main(String[] args) {
LocalDate today = LocalDate.now(); // 获取当前日期
DayOfWeek dayOfWeek = today.getDayOfWeek(); // 获取DayOfWeek枚举
System.out.println("今天是星期:" + dayOfWeek); // 输出枚举值,如MONDAY
System.out.println("今天是星期:" + dayOfWeek.getValue()); // 输出数值(1=周一,7=周日)
}
}
获取中文星期名称
如果需要输出中文星期名称,可以通过枚举的toString()方法或自定义映射实现:

String chineseWeekDay = switch (dayOfWeek) {
case MONDAY -> "周一";
case TUESDAY -> "周二";
case WEDNESDAY -> "周三";
case THURSDAY -> "周四";
case FRIDAY -> "周五";
case SATURDAY -> "周六";
case SUNDAY -> "周日";
};
System.out.println("今天是星期:" + chineseWeekDay);
处理指定日期的星期几
java.time包的优势在于可以轻松处理任意日期:
LocalDate date = LocalDate.of(2023, 10, 1); // 2023年10月1日
DayOfWeek day = date.getDayOfWeek();
System.out.println("2023年10月1日是星期:" + day);
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
SimpleDateFormat |
简单易用,支持自定义格式 | 线程不安全,API过时 | 旧项目维护或简单日期格式化 |
Calendar |
功能丰富,支持日期计算 | API繁琐,线程不安全 | Java 8之前的复杂日期操作 |
java.time |
线程安全,API直观,功能强大 | 需Java 8+ | 新项目开发,推荐首选 |
最佳实践建议:
- 如果项目使用Java 8及以上版本,优先选择
java.time包,代码更简洁且不易出错。 - 对于需要国际化支持的场景,
java.time的DayOfWeek枚举可直接适配不同语言环境。 - 在处理日期格式化时,可结合
DateTimeFormatter类实现更复杂的格式需求,import java.time.format.DateTimeFormatter; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EEEE"); System.out.println(today.format(formatter)); // 输出:2023年10月01日 星期日
通过以上方法,开发者可以根据项目需求灵活选择合适的方案,高效实现星期几的输出功能,掌握java.time包的使用不仅能提升代码质量,还能避免传统API的潜在问题,是现代Java开发必备的技能。



















