问题描述
对于日程应用程序,我需要从列表中确定今天之后的第一天,向前推进。例如:
DayOfWeek today -> SATURDAY
val list1 = listof(MONDAY,TUESDAY,FRIDAY)
DayOfWeek today -> WednESDAY
val list2 = listof(TUESDAY)
然后逻辑将不得不为 list1 提供 MONDAY,为 list2 提供 TUESDAY。我知道 DayOfWeek 枚举类和 .plusDays()
上的 TemporalAdjusters.nextOrSame()
函数,但是你必须提供一个 DayOfWeek,我不知道,因为我试图在列表中找到它。
解决方法
LocalDate today = LocalDate.now(ZoneId.systemDefault());
List<DayOfWeek> list = List.of(DayOfWeek.MONDAY,DayOfWeek.TUESDAY,DayOfWeek.FRIDAY);
DayOfWeek first = Collections.min(list,Comparator.comparing(dow -> today.with(TemporalAdjusters.nextOrSame(dow))));
System.out.println(first);
今天运行时的输出(我所在时区的星期六):
星期一
我正在使用一个比较器来查询最小值,该比较器比较了一周中下一次出现的日期(今天,如果今天恰好是那一天)。由于周一先到,因此这被视为最低要求。我间接调用了您在列表中的每个成员中提到的 TemporalAdjusters.nextOrSame()
方法。这可能不是最省时的方法,但对于 20 个目的中的 19 个,我确信这很好。它提供了简短且我认为可读的代码,这更重要。
如果今天是星期三?让我们尝试将 today
设置为下周三:
LocalDate today = LocalDate.of(2021,Month.JUNE,23);
现在输出是:
星期五
,这里是 Ole V.V.'s answer,作为函数翻译成 Kotlin。
OpenSSL unable to verify data: error:0909006C:PEM routines:get_name:no start line
如果列表为空,这将返回 fun nextWeekDayInList(list: List<DayOfWeek>,today: LocalDate) =
list.minByOrNull { dow ->
today.with(TemporalAdjusters.nextOrSame(dow))
}
。
用法:
null
从your recent comment来看,println(nextWeekDayInList(
listOf(DayOfWeek.MONDAY,DayOfWeek.FRIDAY),today = LocalDate.now(ZoneId.systemDefault())
))
可能比next
更合适。
我迟到了,但我已经创建了一个解决方案。所以,发布它。
package com.ubaid;
import lombok.extern.slf4j.Slf4j;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class Demo {
public static void main(String[] args) {
List<DayOfWeek> list = List.of(DayOfWeek.MONDAY,DayOfWeek.FRIDAY);
DayOfWeek nextDay = getFirstDayInListAfterTodayGoingForward(list);
//will print MONDAY (today is SATURDAY)
log.debug(String.valueOf(nextDay));
list = List.of(DayOfWeek.TUESDAY);
nextDay = getFirstDayInListAfterTodayGoingForward(list);
//will print TUESDAY (today is SATURDAY)
log.debug(String.valueOf(nextDay));
}
/**
*
* @param list of days of week
* @return first day of week after today or today if today is present in the list
*/
private static DayOfWeek getFirstDayInListAfterTodayGoingForward(List<DayOfWeek> list) {
//MONDAY value is 1
// .
// .
//SUNDAY value is 7
//getting today value
int todayVal = DayOfWeek.from(LocalDate.now()).getValue();
//sort the DAYS according to their ordinal values
List<Integer> daysInListVal = list
.stream()
.map(DayOfWeek::getValue)
.sorted()
.collect(Collectors.toList());
if (daysInListVal.contains(todayVal)) {
return DayOfWeek.of(todayVal);
}
//now get the DAY value which is next to today DAY
//If next value is not present then pick the first item of sorted list
return daysInListVal
.stream()
.filter(dayInList -> dayInList > todayVal)
.findFirst()
.map(DayOfWeek::of)
.orElse(DayOfWeek.of(daysInListVal.stream().findFirst().orElseThrow()));
}
}