简单的万年历中的农历节日获取办法

2024年12月20日

原创内容,转载请注明出处:https://www.myzhenai.com.cn/post/4608.html

因为我的几个博客上都有自动获取节日日期并显示灯笼效果,像一些固定日期的节日比较好处理,问题就在一些农历的节日获取上有一些难度,也不是说不能处理,但是要么需要调用一些接口,要么需要安装一些库和类。

我不太想安装一些库和类,同时调用的一些接口又担心不太稳定,所以一直在找稳定的接口,终于找到了一个,香港天文台的农历接口。

shell获取每年农历节日的日期:https://www.myzhenai.com.cn/post/3711.html
自动获取节日日期并显示灯笼效果的PHP源码:https://www.myzhenai.com.cn/post/3724.html

为了使用稳定的接口,所以我找到了香港天文台的一个接口,这个可以说是非商用和可以稳定的接口了,但香港中文台的接口只能查询一天,我需要的是一次查询一年的,然后在本地调用查询就可以了。

所以在这里需要用到Shell接所有天数的对照都curl一遍。

香港天文台接口地址:https://data.weather.gov.hk/weatherAPI/opendata/lunardate.php?date=2025-01-29

Shell代码

#!/bin/bash

# 定义香港天文台 API 的基础 URL
API_URL="https://data.weather.gov.hk/weatherAPI/opendata/lunardate.php?date="

# 定义输出文件路径
OUTPUT_FILE="/path/to/your/project/jieri.json"

# 当前年份
YEAR=$(date +%Y)

# 指定的农历节日名称
FESTIVALS=("除夕" "春节" "元宵" "端午" "七夕" "中秋")

# 日期和节日映射数组
declare -A FESTIVAL_DATES

# 定义每个节日的农历日期(示例)
declare -A LUNAR_DATES
LUNAR_DATES=(
    ["除夕"]="腊月廿九"
    ["春节"]="正月初一"
    ["元宵"]="正月十五"
    ["端午"]="五月初五"
    ["七夕"]="七月初七"
    ["中秋"]="八月十五"
)

# 遍历每一天,查找匹配的节日
for month in {01..12}
do
  for day in {01..31}
  do
    # 当前日期
    date="$YEAR-$month-$day"

    # 调用 API 获取农历信息
    response=$(curl -s "$API_URL$date")

    # 提取农历日期
    lunar_date=$(echo "$response" | jq -r '.LunarDate')

    # 检查是否为指定的农历节日
    for festival in "${!LUNAR_DATES[@]}"
    do
      if [ "$lunar_date" == "${LUNAR_DATES[$festival]}" ]; then
        FESTIVAL_DATES["$festival"]="$date"
      fi
    done
  done
done

# 将结果保存为 JSON 文件
echo "{" > $OUTPUT_FILE
for festival in "${!FESTIVAL_DATES[@]}"
do
  echo "  \"$festival\": \"${FESTIVAL_DATES[$festival]}\"," >> $OUTPUT_FILE
done
# 删除最后一个逗号并关闭 JSON
sed -i '$ s/,$//' $OUTPUT_FILE
echo "}" >> $OUTPUT_FILE

echo "节日数据已保存到 $OUTPUT_FILE"
#!/bin/bash

# API接口地址
API_URL="https://data.weather.gov.hk/weatherAPI/opendata/lunardate.php"

# 当前年份
YEAR=$(date +%Y)

# 农历节日对应的农历日期
FESTIVALS=("除夕" "春节" "元宵" "七夕" "端午" "中秋")

# 初始化jieri.json
echo "[]" > jieri.json

# 循环遍历每个农历节日
for FESTIVAL in "${FESTIVALS[@]}"
do
  # 从年初开始查询,直到找到对应的节日
  LUNAR_DATE=$(date -d "$YEAR-01-01" +%m-%d)
  while [ "$LUNAR_DATE" != "$FESTIVAL" ]
  do
    JSON=$(curl -s "${API_URL}?date=${YEAR}-${LUNAR_DATE//-/}")
    LUNAR_INFO=$(echo $JSON | sed 's/.*"LunarDate":" $[^"]*$ ".*/\1/')
    if [ "$LUNAR_INFO" == "$FESTIVAL" ]; then
      # 找到对应的节日,将其添加到jieri.json
      echo ",{\"date\":\"$YEAR-${LUNAR_DATE//-/}\",\"festival\":\"$FESTIVAL\"}" >> jieri.json
      break
    fi
    LUNAR_DATE=$(date -d "$YEAR-${LUNAR_DATE//-/} + 1 day" +%m-%d)
  done
done

# 移除jieri.json文件开头的逗号
sed -i 's/^,//' jieri.json
0 0 1 1 * /path/to/your/script.sh

每年1月1日自动执行脚本

 


sicnature ---------------------------------------------------------------------
I P 地 址: 3.133.135.106
区 域 位 置: 美国
系 统 信 息: 美国
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source http://myzhenai.com/post/4608.html

没有评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注