如何在 Java 中使用 LocalDate 確定一周的第一天的日期
一、概述
在這個簡短的教程中,我們將討論如何使用 Java 中的LocalDate
輸入查找一周的第一天。
2.問題陳述
我們經常需要一周的第一天來為業務邏輯建立一周的邊界,比如為員工建立一個時間跟踪系統。
在 Java 8 之前, JodaTime
庫用於查找一周的第一天.
但是,在 Java 8 之後,不再提供對它的支持。因此,我們將了解如何使用作為java.time.LocalDate
類的一部分提供的功能來查找一周的第一天。
3. Calendar
類
我們可以抽出一周中的一天並使用java.util.Calendar
類及時回溯。首先,我們可以根據我們定義的第一天(週日/週一)循環到一周的開始。
讓我們為相同的設置Calendar
類的對象:
Calendar calendar = Calendar.getInstance();
ZoneId zoneId = ZoneId.systemDefault();
Date date = Date.from(localDate.atStartOfDay(zoneId).toInstant());
calendar.setTime(date);
一旦設置了日曆對象,我們必須建立一個固定的日子作為一周的第一天。根據 ISO 標準,它可以是星期一,也可以是世界上許多國家(例如美國)遵循的星期日。我們可以繼續循環遍歷,直到我們到達我們確定的一周的第一天:
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
calendar.add(Calendar.DATE, -1);
}
我們可以看到,在到達星期一之前一次減去一天有助於我們檢索一周第一天的日期。 Calendar.MONDAY
是在Calendar
類中定義的常量。我們現在可以將日曆日期轉換為java.time.
LocalDate
:
LocalDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId()).toLocalDate()
4. TemporalAdjuster
TemporalAdjuster允許我們執行複雜的日期操作。例如,我們可以獲得下一個星期日的日期、當月的最後一天或下一年的第一天。
根據我們如何建立一周的第一天,我們可以使用它來確定一周中的星期一或星期日的日期:
DayOfWeek weekStart = DayOfWeek.MONDAY;
return localDate.with(TemporalAdjusters.previousOrSame(weekStart));
previousOrSame
函數返回一個TemporalAdjuster.
TemporalAdjuster
返回指定週的前一次出現,如果當前日期已經在該日,則返回該週的同一天。我們可以使用它來調整日期併計算給定日期的一周開始時間。
5. TemporalField
TemporalField
表示日期時間字段,例如年月或時分。我們可以調整輸入日期以獲得給定輸入日期的一周的第一天。
我們可以使用dayOfWeek
函數來訪問基於WeekFields
的一周的第一天。 Java 日期和時間 API 的WeekFields
類表示基於週的年份及其組成部分,包括週數、星期幾和基於週的年份。
當一周的第一天是星期日時,一周的天數是從 1 到 7,其中 1 是星期日,7 是星期六。它提供了一種使用 ISO 週日期的便捷方式。這可以幫助我們獲取一周中第一天的日期:
TemporalField fieldISO = WeekFields.of(locale).dayOfWeek();
return localDate.with(fieldISO, 1);
在這種情況下,我們正在傳遞語言環境;因此,一周的第一天是星期日還是星期一的定義將取決於地區。為了避免這種情況,我們可以使用 ISO 標準,它接受星期一作為一周的第一天:
TemporalField dayOfWeek = WeekFields.ISO.dayOfWeek();
return localDate.with(dayOfWeek, dayOfWeek.range().getMinimum());
該代碼片段使用 ISO 日曆系統返回給定LocalDate
實例的一周第一天的日期,該日期從星期一開始,作為一周的第一天。它通過將星期幾字段設置為給定LocalDate
實例的最小有效值(即 1 表示星期一)來實現這一點。
六,結論
在本文中,我們從 Java 中的LocalDate
中檢索了一周中第一天的日期。我們看到瞭如何使用 Calendar 類以及使用TemporalAdjuster
和TemporalField
多種方式來做同樣的事情
與往常一樣,代碼在 GitHub 上可用。