我有以下Holiday
课程:
public class Holiday {
private int day;
private int month;
public Holiday(GregorianCalendar calendar) {
this.day = calendar.get(GregorianCalendar.DAY_OF_MONTH);
this.month = calendar.get(GregorianCalendar.MONTH) + 1;
}
}
枚举日:
public enum Day {
SATURDAY(6), SUNDAY(7);
private int index;
Day(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
}
public class DateTool {
private static final String DATE_FORMAT = "yyyy_MM_dd";
public DateTool() {
super();
}
public static String getPreviousWorkingDay(List<Holiday> listOfHolidays) {
//derive the last working day that is not saturday/sunday
}
public static String parseDate(Date date) {
return new SimpleDateFormat(DATE_FORMAT).format(date);
}
public static boolean isSunday(LocalDateTime date) {
return date.getDayOfWeek().getValue() == Day.SUNDAY.getIndex();
}
public static boolean isSaturday(LocalDateTime date) {
return date.getDayOfWeek().getValue() == Day.SATURDAY.getIndex();
}
}
鉴于我list
已holidays
,我如何计算并以getPreviousWorkingDay(...)
方法返回上一个工作日,这将排除星期六和星期日?
我正在尝试派生最后一个文件日期来寻找这样的东西我正在努力解决
if (todayIsHoliday(listOfHolidays)) {
getPreviousWorkingDay(listOfHolidays);
}
所以如果当天是假日,请查看最后一个非假日日期并以字符串格式返回。
我不确定如何回顾。请注意,假日列表不仅仅是周六和周日。他们是乡村假期,例如农历新年等。
我正在使用java 8,所以欢迎任何重构或改进:)
答案 0 :(得分:4)
private static final DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("uuuu_MM_dd");
public static String getPreviousWorkingDay(List<MonthDay> listOfHolidays) {
LocalDate workingDay = LocalDate.now(ZoneId.of("Pacific/Easter")).minusDays(1);
while (workingDay.getDayOfWeek().equals(DayOfWeek.SATURDAY)
|| workingDay.getDayOfWeek().equals(DayOfWeek.SUNDAY)
|| listOfHolidays.contains(MonthDay.from(workingDay))) {
workingDay = workingDay.minusDays(1);
}
return workingDay.format(dateFormatter);
}
我正在使用java.time
,现代Java日期和时间API,并且如评论中所述,我建议您也这样做。让我们看看上面的方法:
System.out.println(getPreviousWorkingDay(Collections.emptyList()));
// Let’s say Valentin’s day is a holiday
System.out.println(getPreviousWorkingDay(List.of(MonthDay.of(Month.FEBRUARY, 14))));
// And so are Lent Monday and the death day of Danish would-be king Henrik
System.out.println(getPreviousWorkingDay(List.of(MonthDay.of(Month.FEBRUARY, 12),
MonthDay.of(Month.FEBRUARY, 13), MonthDay.of(Month.FEBRUARY, 14))));
今天打印出来了:
2018_02_14
2018_02_13
2018_02_09
(因为周一的Lent不是每年的同一天,我有点作弊;但我认为并不需要考虑这样的假期。)
由于确定今天的日期是时区敏感操作,如果不是复活节岛时区,请替换您所需的时区。编辑:在Java 8中使用Arrays.asList()
而不是Java 9 List.of()
。
链接: Oracle tutorial: Date Time解释如何使用java.time
。
答案 1 :(得分:3)
Ole V.V.的回答很好。这里有一些增加这种方法的技巧。
您可以将周末定义为星期六和星期日EnumSet
DayOfWeek
个EnumSet
个对象。 Set
是用于保存枚举对象的Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;
的高效实现。内存非常少,执行速度非常快。
boolean isWeekend = weekend.contains( localDate.getDayOfWeek() ) ;
然后询问该集合中是否包含日期的星期几。
TemporalAdjuster
ThreeTen-Extra项目使用其他功能扩展了java.time。这些功能包括LocalDate nextWeekDay = org.threeten.extra.Temporals.nextWorkingDay( localDate ) ;
,用于在跳过任何星期六或星期日时移至next / previous日期。
TemporalAdjuster
TemporalAdjuster
您可以编写自己的LocalDate nextBusinessDay = localDate.with( com.example.Temporals.nextBusinessDay() ) ;
实现,将所有周末+假日逻辑封装在一个可以通过简单的紧凑呼叫轻松重复使用的地方。
return $query->where(function($q) use ($from) {
$q->where('user_id', $from)
->orWhere('to', $from);
})->where(function ($q) use ($to) {
$q->where('user_id', $to)
->orWhere(to, $to);
})->get();