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/DayOfWeek | Java 8+ | 新API,简洁、安全、类型友好 | 推荐 |
SimpleDateFormat | Java 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)完整步骤
-
获取当前日期对象:
LocalDate.now()
-
获得DayOfWeek对象:
.getDayOfWeek()
-
获取数字值:
.getValue()
(周一=1 ~ 周日=7) -
格式化输出:
LocalDate date = LocalDate.now(); DayOfWeek dow = date.getDayOfWeek(); System.out.println(dow); // MONDAY/TUESDAY… System.out.println(dow.getValue()); // 1~7
5. 国际化处理:
```javaString weekInChinese = date.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE); // “星期一”
(3)实际应用场景
- 自动排班系统需精确判断今天是周几;
- 财务结账每逢周末自动统计;
- 日志分析按“工作日/节假日”区分处理。
三、CALENDAR与SIMPLEDATAFORMAT对比解析
方式对比表
特性 | Calendar | SimpleDateFormat |
---|---|---|
获取方式 | 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/SimpleDateFormat | java.time.LocalDate/DayOfWeek |
---|---|---|
引入版本 | JDK 1.0/1.1 | JDK 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~7String 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_WEEK | 1 ~ 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
会被替换成对应语言环境下完整的星期名称,非常适合生成用户友好的时间展示格式。
文章版权归"
转载请注明出处:https://blog.vientianeark.cn/p/2355/
温馨提示:文章由AI大模型生成,如有侵权,联系 mumuerchuan@gmail.com
删除。