java計(jì)算指定日期為本年第幾周的實(shí)例
編程中經(jīng)常遇到日期計(jì)算,由于項(xiàng)目中使用到按周統(tǒng)計(jì)數(shù)據(jù),但是mysql中按所在月的周數(shù)周統(tǒng)計(jì)比較麻煩,于是采用所在年的周數(shù)作為分組條件,再通過(guò)java計(jì)算日期屬于年的第一周來(lái)進(jìn)行二次計(jì)算,提高性能。
找了下計(jì)算指定日期為本年第幾周的方法,發(fā)現(xiàn)沒(méi)有現(xiàn)成的API,但網(wǎng)上給出的方法大部分都有個(gè)缺陷:
若12月31日是 周最后一天(有的以周一為每周的第一天,有的以周日為周的第一天),則計(jì)算正常,否則所在周會(huì)被計(jì)算為下一年的第一周,于是做此記錄。
java8及以上版本可以采用LocalDate/LocalDateTime
/** 獲取當(dāng)年的第幾周,返回值范圍為1-53 */
public static int getWeekOfYear(LocalDate date) {
TemporalField field = WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear();
int week = date.get(field);
// 12-31會(huì)被計(jì)算為下一年的第1周,所以需要特殊處理
if (week == 1 && getLocalDate().getMonth() == Month.DECEMBER) {
return LocalDate.of(date.getYear(), 12,31)// 直接使用指定日期的12月31日作為錨點(diǎn)
.addDays(-7)// 往上推一周,一定是本年倒數(shù)第二周
.getLocalDate().get(field) + 1;
}
return week;
}
java8以下版本使用Calendar
public static int getWeekOfYear(Date date) {
Calendar calendar = Calendar.getInstance(Locale.getDefault());
calendar.setTime(date);
calendar.setFirstDayOfWeek(Calendar.SUNDAY); // 設(shè)置每周的第一天為星期日
int week = calendar.get(Calendar.WEEK_OF_YEAR);
if (week == 1 && calendar.get(Calendar.MONTH) == Calendar.DECEMBER) {
calendar.add(Calendar.DAY_OF_MONTH, -7);
return calendar.get(Calendar.WEEK_OF_YEAR) + 1;
}
return week;
}
以周日為每周第一天為例,運(yùn)行結(jié)果如下

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 指定微信好友自動(dòng)發(fā)送消息的實(shí)現(xiàn)示例
這篇文章主要介紹了Java 指定微信好友自動(dòng)發(fā)送消息的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
SpringBoot控制臺(tái)秒變炫彩特效的實(shí)現(xiàn)指南
本文介紹如何自定義SpringBoot啟動(dòng)橫幅,通過(guò)banner.txt文件設(shè)置ASCII圖案、版本號(hào)等,并使用ANSI顏色增強(qiáng)效果,還提供關(guān)閉默認(rèn)Banner、添加啟動(dòng)信息及彩色提示的實(shí)現(xiàn)方法,需要的朋友可以參考下2025-10-10
SpringBoot中統(tǒng)計(jì)方法耗時(shí)的七種實(shí)現(xiàn)方式小結(jié)
作為開(kāi)發(fā)者,我們經(jīng)常需要統(tǒng)計(jì)方法的執(zhí)行時(shí)間,以便找出性能瓶頸,優(yōu)化系統(tǒng)響應(yīng)速度,今天分享在SpringBoot框架中實(shí)現(xiàn)方法耗時(shí)統(tǒng)計(jì)的幾種方法,大家可以根據(jù)需求自行選擇2025-03-03
Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的簡(jiǎn)單定義與使用方法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的簡(jiǎn)單定義與使用方法,簡(jiǎn)單描述了隊(duì)列的功能、特點(diǎn),并結(jié)合java實(shí)例形式分析了隊(duì)列的簡(jiǎn)單定義與使用方法,需要的朋友可以參考下2017-10-10
Java 并發(fā)編程學(xué)習(xí)筆記之核心理論基礎(chǔ)
編寫(xiě)優(yōu)質(zhì)的并發(fā)代碼是一件難度極高的事情。Java語(yǔ)言從第一版本開(kāi)始內(nèi)置了對(duì)多線程的支持,這一點(diǎn)在當(dāng)年是非常了不起的,但是當(dāng)我們對(duì)并發(fā)編程有了更深刻的認(rèn)識(shí)和更多的實(shí)踐后,實(shí)現(xiàn)并發(fā)編程就有了更多的方案和更好的選擇。本文是對(duì)并發(fā)編程的核心理論做了下小結(jié)2016-05-05
Spring boot通過(guò)切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過(guò)程
這篇文章主要介紹了Spring boot通過(guò)切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

