农历数据获取

308 阅读2分钟

获取的数据包括

  • 当日农历日期
  • 当年属相
  • 当日宜、忌
  • 当日节日,二十四节气、法定节假日等
  • 调休和补班情况
  1. 数据渲染示例

来源:

https://www.baidu.com/s?ie=UTF-8&wd=%E5%85%AC%E7%AB%8B%E5%86%9C%E5%8E%86%E8%BD%AC%E6%8D%A2

  1. API地址

  • 可根据阳历年和月查询到当月所有日期的农历数据
  • 2023年7.28日测试有效,数据可获取到2050年
  • API地址:从百度搜索首页获取。
  • year和month需要替换成需要查询的年月
https://opendata.baidu.com/data/inner?tn=reserved_all_res_tn&type=json&resource_id=52109&query=2023%E5%B9%B45%E6%9C%88&apiType=yearMonthData
  1. json数据示例

{
            "animal": "兔",
            "avoid": "结婚.搬新房.祭祀.开光",
            "cnDay": "二",
            "day": "21",
            "festivalInfoList": [
                {
                    "baikeId": "16864",
                    "baikeName": "春分",
                    "baikeUrl": "https://baike.baidu.com/item/春分/16864",
                    "name": "春分"
                },
                {
                    "baikeId": "411884",
                    "baikeName": "世界睡眠日",
                    "baikeUrl": "https://baike.baidu.com/item/世界睡眠日/411884",
                    "name": "世界睡眠日"
                }
            ],
            "festivalList": "春分,世界睡眠日,世界儿歌日,世界森林日",
            "gzDate": "戊寅",
            "gzMonth": "乙卯",
            "gzYear": "癸卯",
            "isBigMonth": "1",
            "lDate": "三十",
            "lMonth": "二",
            "lunarDate": "30",
            "lunarMonth": "2",
            "lunarYear": "2023",
            "month": "3",
            "oDate": "2023-03-20T16:00:00Z",
            "suit": "合婚订婚.签订合同.交易.纳财.买衣服.订盟.买车.安床.安机械.纳畜.架马.安葬.造仓.拆卸.入殓.修坟.移柩.成人礼.补垣.成服.除服.伐木.立碑.破土.迁坟.塞穴.筑堤.合帐",
            "term": "春分",
            "timestamp": "1679328000",
            "value": "世界睡眠日 世界儿歌日 世界森林日",
            "status": "",// 1表示调休 2表示补班
            "year": "2023",
            "yjJumpUrl": "https://mobile.51wnl-cq.com/huangli_tab_h5/?posId=BDSS&STIME=2023-03-21",
            "yj_from": "51wnl"
        }
  1. Dart 下载数据代码

import 'dart:io';
import 'dart:async';
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';

// 从百度API下载
void downFromBaidu() async {
  print("downFromBaidu");
  Map<String,Map> data = {};
  Dio dio = Dio();
  // int year = 1949;
  // int yearEnd = 2123;
  int year = 2051;
  int yearEnd = 2051;
  int month = 1;
  Timer.periodic(const Duration(seconds: 3), (timer) async {
    //
    print("load:$year ---- $month");
    Response r = await dio.get(
        "https://opendata.baidu.com/data/inner?tn=reserved_all_res_tn&type=json&resource_id=52109&query=$year%E5%B9%B4$month%E6%9C%88&apiType=yearMonthData");
    print("ResultCode:${r.data["ResultCode"]}");
    // print("Result :${r.data}");
    print("load:$month complete");
    //
    if(data["$year"] == null ){
      data["$year"] = {};
    }

    dynamic monthData = r.data["Result"][0]["DisplayData"]["resultData"]["tplData"]["data"];
    if(monthData != null){
      List almanac = monthData["almanac"];
      Map myAlmanac = {};
      for (var element in almanac) {
        if(int.parse(element["year"]) == year && int.parse(element["month"]) == month){
          myAlmanac[element["day"]] = element;
        }
      }
      monthData = myAlmanac;
    }
    //
    data["$year"]!["$month"] = monthData;
    if (month == 12) {
      // 保存
      String text = jsonEncode(data["$year"]);
      final directory = await getApplicationDocumentsDirectory();
      String path = '${directory.path}/calendar/$year.json';
      print("path:$path");
      final file = File(path);
      await file.writeAsString(text);
      //
      month = 1;
      data["$year"] = {};
      year = year + 1;
      //
    } else {
      month = month + 1;
    }
    if (year > yearEnd) {
      timer.cancel();
    }
  });
}
  1. 抓取的数据ZIP

从API抓取了1949.1月-2050.12月的农历数据,如下:

暂时无法在飞书文档外展示此内容