You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Pandas个性化假日日历中添加USThanksgivingDayDayAfter?

如何添加感恩节后次日(黑色星期五)到你的个性化假日日历

嘿,我来帮你搞定这个问题!要添加USThanksgivingDayDayAfter(也就是感恩节后的周五,俗称黑色星期五)作为新假日,核心逻辑其实很简单:先算出当年美国感恩节的日期,再往后推一天就行。下面我给你举两个主流语言的实现例子,你可以根据自己用的语言调整:

假设你用Java(基于java.time API)

首先,我们先实现感恩节的计算逻辑,再基于它得到次日的日期,最后把这个假日注册到你的日历类里:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class CustomHolidayCalendar {
    // 存储假日名称和对应的日期计算函数
    private final Map<String, Function<Integer, LocalDate>> holidayCalculators = new HashMap<>();

    public CustomHolidayCalendar() {
        // 先注册已有的假日,比如感恩节本身
        holidayCalculators.put("USThanksgivingDay", this::calculateUSThanksgiving);
        // 现在注册我们需要的感恩节后次日
        holidayCalculators.put("USThanksgivingDayDayAfter", this::calculateUSThanksgivingDayAfter);
    }

    // 计算美国感恩节:11月的第四个星期四
    private LocalDate calculateUSThanksgiving(int year) {
        LocalDate novemberFirst = LocalDate.of(year, Month.NOVEMBER, 1);
        // 找到11月第一个周四的日期
        int daysToFirstThursday = (DayOfWeek.THURSDAY.getValue() - novemberFirst.getDayOfWeek().getValue() + 7) % 7;
        LocalDate firstThursday = novemberFirst.plusDays(daysToFirstThursday);
        // 第四个周四就是第一个周四加3周(21天)
        return firstThursday.plusWeeks(3);
    }

    // 计算感恩节后次日:感恩节日期加1天
    private LocalDate calculateUSThanksgivingDayAfter(int year) {
        return calculateUSThanksgiving(year).plusDays(1);
    }

    // 获取指定年份的某个假日日期
    public LocalDate getHolidayDate(String holidayName, int year) {
        Function<Integer, LocalDate> calculator = holidayCalculators.get(holidayName);
        if (calculator == null) {
            throw new IllegalArgumentException("找不到对应的假日:" + holidayName);
        }
        return calculator.apply(year);
    }

    // 测试示例
    public static void main(String[] args) {
        CustomHolidayCalendar calendar = new CustomHolidayCalendar();
        LocalDate blackFriday2024 = calendar.getHolidayDate("USThanksgivingDayDayAfter", 2024);
        System.out.println("2024年感恩节后次日:" + blackFriday2024); // 输出 2024-11-29
    }
}

如果你用Python

同样的逻辑,用Python实现的话是这样:

from datetime import date, timedelta
import calendar

class CustomHolidayCalendar:
    def __init__(self):
        # 注册假日及其计算方法
        self.holiday_calculators = {
            "USThanksgivingDay": self._calculate_us_thanksgiving,
            "USThanksgivingDayDayAfter": self._calculate_us_thanksgiving_day_after
        }

    # 计算美国感恩节:11月第四个星期四
    def _calculate_us_thanksgiving(self, year):
        november_cal = calendar.monthcalendar(year, 11)
        # 判断第一周是否有周四,有的话取第一周周四+21天,否则取第二周周四+14天
        if november_cal[0][calendar.THURSDAY] != 0:
            thanksgiving_day = november_cal[0][calendar.THURSDAY] + 21
        else:
            thanksgiving_day = november_cal[1][calendar.THURSDAY] + 14
        return date(year, 11, thanksgiving_day)

    # 计算感恩节后次日
    def _calculate_us_thanksgiving_day_after(self, year):
        return self._calculate_us_thanksgiving(year) + timedelta(days=1)

    # 获取指定年份的假日日期
    def get_holiday_date(self, holiday_name, year):
        if holiday_name not in self.holiday_calculators:
            raise ValueError(f"未知假日:{holiday_name}")
        return self.holiday_calculators[holiday_name](year)

# 测试示例
if __name__ == "__main__":
    calendar = CustomHolidayCalendar()
    black_friday_2024 = calendar.get_holiday_date("USThanksgivingDayDayAfter", 2024)
    print(f"2024年感恩节后次日:{black_friday_2024}") # 输出 2024-11-29

核心思路总结

不管你用什么语言,步骤都是这三步:

  • 实现美国感恩节的日期计算逻辑(11月第四个周四);
  • 基于感恩节日期,加1天得到USThanksgivingDayDayAfter的日期;
  • 把这个新假日的计算逻辑注册到你的日历类中,和其他假日统一管理。

这样你就可以像调用其他假日一样,轻松获取感恩节后次日的日期啦!

内容的提问来源于stack exchange,提问作者Zanam

火山引擎 最新活动