当前位置: 首页 > 知识库问答 >
问题:

不是假日的上一个工作日期

王英彦
2023-03-14

我有以下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();
    }

}
  if (todayIsHoliday(listOfHolidays)) {
                getPreviousWorkingDay(listOfHolidays);
            }

我不确定该如何回头看。请注意假期的列表不仅仅是周六和周日。它们是乡村节日,如中国的新年等。

我正在使用Java8,因此任何重构或改进都是受欢迎的:)

共有1个答案

葛桐
2023-03-14
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

(我有点作弊了,因为每年的四旬斋星期一都不是同一天;但我觉得不需要把这样的假期考虑在内。)

链接:Oracle教程:日期时间说明如何使用java.Time

 类似资料:
  • 问题内容: 我有一个在工作日(周一至周五)运行的sis软件包。如果我在星期二(background(DB))收到文件,则它需要前一个工作日的日期并进行一些交易。如果我在星期五运行工作,则必须获取星期一日期并处理交易。 我已使用以下查询获取之前的营业日期 如果我执行此查询,我将获得昨天的Transactios的结果。如果我在星期一运行相同的查询,则必须获取星期五的交易而不是星期日。 问题答案: 我更

  • 问题内容: 如何获得两个工作日之间的工作天数,即不包括周末和节假日?假期是指法律认可的假期。由于每个国家/地区的假期不同,因此必须取决于国家/地区。 例如,由于介于两者之间的周末,应返回而不是。 我已经看过Jollyday和ObjectLab- Kit ,但是我不能让它们满足我的需要。我的意思是,他们两个都有很多有趣的方法,但是找不到类似…的东西。 问题答案: 最后是基于API 的解决方案: 致电

  • 我试图在MongoDb上获取一个名为“fecha”的日志,其中包含一个日期字段。 在Java中执行代码后,我得到下一个查询: 但是我没有得到任何结果。以下是一些数据样本: 我的Java代码是下一个: 谢谢

  • 问题内容: 我需要计算两个日期之间的营业日。例如:我们7月4日放假。所以如果我的日期是date1 = 07/03/2012 date2 = 07/06/2012 由于7月4日为节假日,因此,这些日期的黑白工作日应该为1。 我有一种下面的方法来计算工作日,该工作日仅计算周末,而不计算假期。还有什么方法可以计算假期吗....请帮我。 问题答案: 假设您有一个包含所有假期的列表。 只需在您的条件中添加条

  • 问题内容: 假设我在数据库中存储了一堆假期。 我需要做的是找出下一个工作日,不包括数据库中定义的星期六和公众假期。 例如。 假设今天是2月15日(星期五),而17日和18日是公众假期(在数据库中定义为日期时间)。因此,现在当我按下显示下一个工作日的按钮时,它将返回2月19日。 哪种方法最有效? 问题答案: 最简单 第1步:从数据库获取假期并将其格式化为您的格式,并将其保留在 第2步:创建一个增加天

  • 问题内容: 如何计算SQL Server中两个日期之间的工作日数? 星期一至星期五,它必须是T-SQL。 问题答案: 对于周一至周五的工作日,您可以使用单个SELECT进行操作,如下所示: 如果要包括假期,则必须进行一些调整…