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

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代码

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/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 的基础 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 的基础 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"
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/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
#!/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
#!/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
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
0 0 1 1 * /path/to/your/script.sh
0 0 1 1 * /path/to/your/script.sh
0 0 1 1 * /path/to/your/script.sh

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

 


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

1 评论

  • 海南胡说 2025年02月6日在10:00 上午

    百度的接口:https://opendata.baidu.com/data/inner?type=json&resource_id=52109&query=2025%E5%B9%B45%E6%9C%88&apiType=yearMonthData

发表回复

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