Jue*_*gen 10 java filter java-8 java-time
我想写一个布尔值函数,如果给定LocalDateTime落在两个特定时间点之间,则返回true,否则返回false.
具体来说,LocalDateTime如果给定日期在格林威治标准时间周五22:00到格林威治标准时间周日23:00之间,我希望有一个过滤器.
骨架看起来像这样:
public boolean isWeekend(LocalDateTime dateTime) {
//Checks if dateTime falls in between Friday's 22:00 GMT and Sunday's 23:00 GMT
//return ...???
}
Run Code Online (Sandbox Code Playgroud)
这基本上是一个周末过滤器,我想知道是否有一个简单的解决方案与新的Java 8时间库(或任何其他现有的过滤器方法).
我知道如何检查星期几,小时等,但要避免重新发明轮子.
您如何期待这样的图书馆工作?当你的周末开始和结束时,你仍然需要告诉它,它最终会比简单的更短
boolean isWeekend(LocalDateTime dt) {
switch(dt.getDayOfWeek()) {
case FRIDAY:
return dt.getHour() >= ...;
case SATURDAY:
return true;
case SUNDAY:
return dt.getHour() < ...;
default:
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
一个简单的方法TemporalQuery就可以解决问题:
static class IsWeekendQuery implements TemporalQuery<Boolean>{
@Override
public Boolean queryFrom(TemporalAccessor temporal) {
return temporal.get(ChronoField.DAY_OF_WEEK) >= 5;
}
}
Run Code Online (Sandbox Code Playgroud)
这样称呼它(.now()用来获取值进行测试):
boolean isItWeekendNow = LocalDateTime.now().query(new IsWeekendQuery());
Run Code Online (Sandbox Code Playgroud)
或者,特别是在UTC时间(.now()用于获取值进行测试):
boolean isItWeekendNow = OffsetDateTime.now(ZoneOffset.UTC).query(new IsWeekendQuery());
Run Code Online (Sandbox Code Playgroud)
超越您的问题,没有理由IsWeekendQuery每次使用它时都创建一个新实例,因此您可能想创建一个静态最终形式TemporalQuery,将逻辑封装在lambda表达式中:
static final TemporalQuery<Boolean> IS_WEEKEND_QUERY =
t -> t.get(ChronoField.DAY_OF_WEEK) >= 5;
boolean isItWeekendNow = OffsetDateTime.now(ZoneOffset.UTC).query(IS_WEEKEND_QUERY);
Run Code Online (Sandbox Code Playgroud)
我写了一个小程序来实现这个
程序
public class TestWeekend {
private static final int FRIDAY = 5;
private static final int SATURDAY = 6;
private static final int SUNDAY = 7;
private static final Integer WEEKEND_START_FRIDAY_CUT_OFF_HOUR = 22;
private static final Integer WEEKEND_END_SUNDAY_CUT_OFF_HOUR = 23;
private static List<Integer> weekendDaysList = Arrays.asList(FRIDAY, SATURDAY, SUNDAY);
public static void main(String []args) throws FileNotFoundException {
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,22,18,39)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,22,21,59)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,22,22,0)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,23,5,0)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,24,8,0)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,24,22,59)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,24,23,0)));
System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,25,11,5)));
}
public static boolean isWeekend(LocalDateTime dateTime) {
System.out.print("Date - "+dateTime+" , ");
if(weekendDaysList.contains(dateTime.getDayOfWeek().getValue()) ){
if(SATURDAY == dateTime.getDayOfWeek().getValue()){
return true;
}
if(FRIDAY == dateTime.getDayOfWeek().getValue() && dateTime.getHour() >=WEEKEND_START_FRIDAY_CUT_OFF_HOUR){
return true;
}else if(SUNDAY == dateTime.getDayOfWeek().getValue() && dateTime.getHour() < WEEKEND_END_SUNDAY_CUT_OFF_HOUR ){
return true;
}
}
//Checks if dateTime falls in between Friday's 22:00 GMT and Sunday's 23:00 GMT
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5118 次 |
| 最近记录: |