跳转到内容

Java 获取周几,如何快速准确判断今天是星期几?

在Java中,获取当前日期是周几可以通过1、使用Calendar类2、使用LocalDate类(Java 8及以上),以及3、利用SimpleDateFormat格式化输出等3种常见方式。实际开发推荐使用第二种方法——LocalDate类,因为它属于新的java.time包,线程安全并且代码简洁易读。例如,通过LocalDate.now().getDayOfWeek()即可直接获得当天是星期几。该方法不仅返回了一个强类型的DayOfWeek枚举,还能很方便地与其他日期处理功能结合使用,更适合现代Java项目。

《java 获取周几》

一、JAVA获取周几的三大主流方式

方法适用版本简要说明是否推荐
Calendar类Java 1.1+老牌API,需手动转换为“周一/二”等形式一般
LocalDate/DayOfWeekJava 8+新API,简洁、安全、类型友好推荐
SimpleDateFormatJava 1.1+可定制输出格式,但已被新API取代备选

示例代码:

  • Calendar示例
Calendar calendar = Calendar.getInstance();
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 周日=1, 周一=2...
  • LocalDate示例
LocalDate today = LocalDate.now();
DayOfWeek dayOfWeek = today.getDayOfWeek(); // 返回MONDAY, TUESDAY等
int dayValue = dayOfWeek.getValue(); // 周一=1, 周日=7
  • SimpleDateFormat示例
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
String weekStr = sdf.format(new Date()); // 输出“星期一”、“Monday”等

二、LOCALDATE方式详解(推荐)

(1)主要优点

  • 类型安全:返回DayOfWeek枚举,不易出错。
  • 支持国际化:可以自定义Locale显示不同语言的星期。
  • 易于与其他新时间API配合,如Period、Duration等。

(2)完整步骤

  1. 获取当前日期对象:LocalDate.now()

  2. 获得DayOfWeek对象:.getDayOfWeek()

  3. 获取数字值:.getValue()(周一=1 ~ 周日=7)

  4. 格式化输出:

LocalDate date = LocalDate.now(); DayOfWeek dow = date.getDayOfWeek(); System.out.println(dow); // MONDAY/TUESDAY… System.out.println(dow.getValue()); // 1~7

5. 国际化处理:
```java
String weekInChinese = date.getDayOfWeek()
.getDisplayName(TextStyle.FULL, Locale.CHINESE); // “星期一”

(3)实际应用场景

  • 自动排班系统需精确判断今天是周几;
  • 财务结账每逢周末自动统计;
  • 日志分析按“工作日/节假日”区分处理。

三、CALENDAR与SIMPLEDATAFORMAT对比解析

方式对比表
特性CalendarSimpleDateFormat
获取方式get(Calendar.DAY_OF_WEEK)format(new Date())
返回类型int (1~7)String (“星期一”)
星期起始默认周日为1可自定义格式
国际化较麻烦支持Locale设置
易用性一般,需要手动转换较好,直接输出字符串
注意点
  • Calendar的DAY_OF_WEEK以“周日”为1,需要自行做适配(如业务要求以周一为首)。
  • SimpleDateFormat线程不安全,Web项目中应避免多线程共享实例。
  • 两者均为老API,不再建议新项目中大量采用。

常见转换逻辑

若需要将Calendar返回的数字转为“星期X”,可采用数组映射:

String[] weeks=\{"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"\};
System.out.println(weeks[dayOfWeek]);

四、新旧API对比及选择建议

优劣对照表
项目java.util.Calendar/SimpleDateFormatjava.time.LocalDate/DayOfWeek
引入版本JDK 1.0/1.1JDK 8
是否线程安全
API设计风格面向过程面向对象/函数式
时间处理能力基础丰富且扩展性强
推荐度不推荐强烈推荐
背景说明

JDK8推出了全新的时间包java.time.*,彻底改进了老旧时间日期体系,使得日期计算更可靠、更现代。因此,在所有新开发或维护项目里,应优先使用LocalDate及其相关API。

实际案例说明

金融行业系统升级后,将原先基于Calendar数据统计迁移到LocalDateTime+Period+TemporalAdjusters体系后,大大减少了因时区、闰年等导致的BUG,并提升并发性能和代码可读性。

五、多语言与自定义格式实现方法

国际化支持示例(英文/中文)
// 英文
System.out.println(dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH)); // Monday
// 中文简体
System.out.println(dow.getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE)); // 星期一
自定义格式输出表格

下表展示如何用不同方式实现多样化输出:

方法输出样式
dow.toString()MONDAY
dow.getValue()数字(如“3”表示周三)
getDisplayName(FULL,ZH)星期三

对于特殊需求,还可以自行拼接字符串实现如“Workday”、“Weekend”等自定义内容判断。

六、高级用法:日期调整与批量判定

对于复杂业务,如统计未来一个月内每一天是周几,可结合Stream和Lambda表达式批量生成:

// 输出本月每天对应的周几(中文)
YearMonth ym = YearMonth.now();
for (int i=1; i<=ym.lengthOfMonth(); i++) \{
LocalDate d = ym.atDay(i);
System.out.printf("%s: %s
", d,
d.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE));
\}

如果要判断是否为工作日或双休日,只需:

boolean isWeekend =
dow == DayOfWeek.SATURDAY || dow == DayOfWeek.SUNDAY;

这极大简化了以前基于数字判断和繁琐switch-case分支逻辑。

七、实用小结与建议

综上所述,在Java中获取当前或任意日期是周几的方法有多种,其中最推荐的是Java8及以上提供的LocalDate+DayOfWeek组合。它不仅易用、安全,而且具备良好的可扩展性和国际化特性。对于历史遗留系统,可以继续兼容Calendar和SimpleDateFormat,但建议逐步迁移到新API,以便提升代码质量和维护效率。在实际应用时,应结合具体业务场景选择合适方案,并注意线程安全、多语言支持以及易读性。如果你正在参与新项目开发,请优先学习并使用java.time.LocalDate系列API,同时关注JDK官方文档和社区最佳实践,以确保你的代码始终保持最新和最优水平。

精品问答:


Java如何获取当前日期是周几?

我在用Java编程时,想知道怎么准确获取当前日期是周几。有没有简洁且性能好的方法能直接返回星期几的名称或者数字?

在Java中,可以使用java.time包下的LocalDate类和DayOfWeek枚举来获取当前日期是周几。示例如下:

import java.time.LocalDate;
import java.time.DayOfWeek;
LocalDate today = LocalDate.now();
DayOfWeek dayOfWeek = today.getDayOfWeek();
System.out.println("今天是星期: " + dayOfWeek);

其中,dayOfWeek返回的是一个DayOfWeek类型,代表周一到周日,默认周一为1,周日为7。这种方式利用了Java 8引入的新时间API,性能稳定且易读。

Java中如何将数字形式的星期转换为中文星期几?

我用Java获取到了一个数字形式的星期值,比如1代表星期一,但我想让它显示成“星期一”、“星期二”这样的中文形式,该怎么实现比较好?

可以通过数组或Map结构将数字映射到对应的中文星期名称。例如:

String[] weekDays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
int dayNumber = LocalDate.now().getDayOfWeek().getValue(); //1~7
String chineseDay = weekDays[dayNumber - 1];
System.out.println(chineseDay);

这种方法简单高效,同时避免了复杂的条件判断。

Java中使用Calendar类获取周几与java.time包有何差异?

我看到很多老代码用Calendar类来获取日期中的‘周几’,但现在又出现了java.time包,我想知道这两者获取‘周几’的方法有什么不同,有没有推荐使用的方案?

Calendar类是早期Java版本提供的日期时间API,通过calendar.get(Calendar.DAY_OF_WEEK)可以得到代表周几的整数(1表示周日,7表示周六)。例如:

方法返回值范围星期对应
Calendar.DAY_OF_WEEK1 ~ 7周日=1, 周一=2,… 周六=7

相比之下,java.time包中的DayOfWeek枚举采用ISO标准定义,getValue()返回范围是1(周一)到7(周日),更符合国际习惯。建议新项目优先使用java.time包,因为它线程安全、设计现代且易于维护。

如何在Java中格式化输出带有‘周几’信息的日期字符串?

我希望在用Java输出日期时,不仅显示年月日,还能显示具体是‘星期几’,请问有什么方便的方法能够格式化输出包含‘周几’信息的完整日期字符串吗?

可以利用DateTimeFormatter结合EEEE模式符号来格式化包含完整‘周几’名称的日期字符串。例如:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EEEE", Locale.CHINA);
String formattedDate = date.format(formatter);
System.out.println(formattedDate); // 输出示例:2024年06月10日 星期一

这里EEEE会被替换成对应语言环境下完整的星期名称,非常适合生成用户友好的时间展示格式。