将日历集 DAY_OF_WEEK 转换为使用 TemporalAdjusters
Convert Calendar set DAY_OF_WEEK to use TemporalAdjusters
我有一些这样的遗留代码
final Calendar cal = new GregorianCalendar();
cal.setTime(today);
// changed on May-03-2004
//cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
cal.add(Calendar.DAY_OF_YEAR, -6);
} else {
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
}
//System.out.println("Begin of cycle: " + cal.getTime());
我想将其转换为使用 java.time TemporalAdjuster class 以希望使其更具可读性。
但我不太确定如何解释 以使行为匹配。
在 https://repl.it/@trajano/setCal
中试玩并尝试不同的组合后确定
代码转换为
public static LocalDate doIt(LocalDate todayDate) {
final LocalDate c2;
if (todayDate.getDayOfWeek() == DayOfWeek.SUNDAY) {
c2 = todayDate.minusDays(6);
} else {
c2 = todayDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
}
return c2;
}
假设 today
确实是今天的日期,那么使用 TemporalAdjusters
的 Java 时间 API 版本将是:
LocalDate today = LocalDate.now();
TemporalAdjuster adjuster = TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY);
LocalDate monday = today.with(adjuster);
System.out.println(today + " -> " + monday);
示例输出
2020-02-01 -> 2020-01-27
2020-02-01
是星期六,2020-01-27
是前一个星期一。
DayOfWeek 实现 TemporalAdjuster
我认为您的代码试图将 Calendar
对象设置为同一 ISO 周的星期一,也就是说,如果今天还不是星期一,则为今天之前的星期一(这并不总是结果不过在所有语言环境中)。当你知道怎么做时,这真的很简单。
LocalDate today = LocalDate.of(2020, Month.FEBRUARY, 2);
LocalDate monday = today.with(DayOfWeek.MONDAY);
System.out.println("Monday of the same week is " + monday + ", a " + monday.getDayOfWeek());
此片段的输出是:
Monday of the same week is 2020-01-27, a MONDAY
LocalDate
始终使用 ISO 日历,其中星期一是一周的第一天,因此 today.with(DayOfWeek.MONDAY)
为您提供同一周的星期一,换句话说,就是前一个星期一今天还不是星期一。 GregorianCalendar
使用了默认区域设置的星期定义,这导致代码有点复杂,以确保它在星期日是一周的第一天的区域设置中也能正确运行。 LocalDate
在所有语言环境中的行为都相同,这是使用 LocalDate
的代码更简单的原因之一。
我有一些这样的遗留代码
final Calendar cal = new GregorianCalendar();
cal.setTime(today);
// changed on May-03-2004
//cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
cal.add(Calendar.DAY_OF_YEAR, -6);
} else {
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
}
//System.out.println("Begin of cycle: " + cal.getTime());
我想将其转换为使用 java.time TemporalAdjuster class 以希望使其更具可读性。
但我不太确定如何解释 以使行为匹配。
在 https://repl.it/@trajano/setCal
中试玩并尝试不同的组合后确定代码转换为
public static LocalDate doIt(LocalDate todayDate) {
final LocalDate c2;
if (todayDate.getDayOfWeek() == DayOfWeek.SUNDAY) {
c2 = todayDate.minusDays(6);
} else {
c2 = todayDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
}
return c2;
}
假设 today
确实是今天的日期,那么使用 TemporalAdjusters
的 Java 时间 API 版本将是:
LocalDate today = LocalDate.now();
TemporalAdjuster adjuster = TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY);
LocalDate monday = today.with(adjuster);
System.out.println(today + " -> " + monday);
示例输出
2020-02-01 -> 2020-01-27
2020-02-01
是星期六,2020-01-27
是前一个星期一。
DayOfWeek 实现 TemporalAdjuster
我认为您的代码试图将 Calendar
对象设置为同一 ISO 周的星期一,也就是说,如果今天还不是星期一,则为今天之前的星期一(这并不总是结果不过在所有语言环境中)。当你知道怎么做时,这真的很简单。
LocalDate today = LocalDate.of(2020, Month.FEBRUARY, 2);
LocalDate monday = today.with(DayOfWeek.MONDAY);
System.out.println("Monday of the same week is " + monday + ", a " + monday.getDayOfWeek());
此片段的输出是:
Monday of the same week is 2020-01-27, a MONDAY
LocalDate
始终使用 ISO 日历,其中星期一是一周的第一天,因此 today.with(DayOfWeek.MONDAY)
为您提供同一周的星期一,换句话说,就是前一个星期一今天还不是星期一。 GregorianCalendar
使用了默认区域设置的星期定义,这导致代码有点复杂,以确保它在星期日是一周的第一天的区域设置中也能正确运行。 LocalDate
在所有语言环境中的行为都相同,这是使用 LocalDate
的代码更简单的原因之一。