我想獲得兩個日期之間的所有周數,每個月計算兩次跨越 2 個月的周數。例如,在 2021 年的第 14 周同時舉辦了 3 月和 4 月,因此在這種情況下,我希望該周計算兩次(一次在 3 月,一次在 4 月)。我查看并發現只是計算兩個日期之間的周數的庫。我想我可以得到周數和月數并形成一個獨特的陣列,但這似乎有點過頭了。有沒有人有任何建議?
uj5u.com熱心網友回復:
跨越 2 個月的周數計算兩次
下面的代碼允許通過僅使用標準LocalDate類及其方法來做到這一點isBefore(),plusWeeks(), plusDays()。
請記住,星期幾和月份由包中的列舉表示java.time。
我做了幾個假設:
- 星期從星期日開始;
- 必須考慮給定周期開始和結束時的一周的大部分時間以及完整的周數。
public static void main(String[] args) {
System.out.println(getWeekCount(LocalDate.of(2022, 1, 1),
LocalDate.of(2022, 2, 1)));
System.out.println(getWeekCount(LocalDate.of(2022, 1, 1),
LocalDate.of(2022, 3, 1)));
}
public static int getWeekCount(LocalDate date1, LocalDate date2) {
int weekCount = 0;
LocalDate cur = date1;
LocalDate finish = date2;
// assumption: week starts with sunday
// assumption: chunk of week at the start and at the end have to be taken into account as well as full weeks
if (cur.getDayOfWeek() != DayOfWeek.SUNDAY) { // adjusting current date
LocalDate next = cur.plusDays(DayOfWeek.SUNDAY.ordinal() - cur.getDayOfWeek().ordinal() 1);
weekCount = getWeeksIncrement(cur, next);
cur = next;
}
if (finish.getDayOfWeek() != DayOfWeek.SUNDAY) { // adjusting finish date
LocalDate previous = finish.minusDays(finish.getDayOfWeek().ordinal() 1);
weekCount = getWeeksIncrement(previous, finish);
finish = previous;
}
while (cur.isBefore(finish) || cur.equals(finish)) {
LocalDate next = cur.plusWeeks(1);
weekCount = getWeeksIncrement(cur, next);
cur = next;
}
return weekCount;
}
public static int getWeeksIncrement(LocalDate cur, LocalDate next) {
return weekIsSharedBetweenTwoMonth(cur, next) ? 2 : 1;
}
public static boolean weekIsSharedBetweenTwoMonth(LocalDate cur, LocalDate next) {
return next.getMonth() != cur.getMonth() &&
next.withDayOfMonth(1).isAfter(cur);
}
輸出
7 - weeks between: 2022-01-01 and 2022-02-01
12 - weeks between: 2022-01-01 and 2022-03-01
uj5u.com熱心網友回復:
您可以使用 java.time 獲得這樣的周數:
LocalDate date = LocalDate.of(year, month, day);
int weekOfYear = date.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
您沒有提及您使用的是哪個 java 版本。java.time 是在 java 8 中引入的。還有其他可用于 pre-java 8 的解決方案。
基于以上,您應該能夠解決您的問題。
uj5u.com熱心網友回復:
這可以通過結合使用 Java 日期和時間 API ( java.time) 和 Java Streams API ( java.util.stream) 來實作:
long weeksBetween(LocalDate start, LocalDate endInclusive) {
LocalDate normalizedStart = start.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate normalizedEndExclusive = endInclusive.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
return Stream.iterate(normalizedStart, d -> d.plusWeeks(1))
.takeWhile(d -> d.isBefore(normalizedEndExclusive))
.mapToInt(d -> d.getMonthValue() == d.plusDays(6).getMonthValue() ? 1 : 2)
.sum();
}
這里發生的情況如下。
首先,日期是標準化的,也就是說,它們被設定為一周的開始(根據 ISO 標準,星期一)。
然后我們遍歷每周的星期一,并檢查其一周的最后一天(星期日)是否在同一個月內。如果是,則屈服1,否則屈服2。
最后,我們將所有產生的值相加。
請注意,我假設一周從星期一開始(ISO)。該代碼還將開始日期的一周視為完整的一周。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/435069.html
