首页 > 其他分享 >【日历】生成ics日历信息

【日历】生成ics日历信息

时间:2024-01-13 09:44:18浏览次数:26  
标签:item festival 日历 print 生成 date lst year ics

参考

https://zhuanlan.zhihu.com/p/547193192

https://blog.csdn.net/Snakewood/article/details/130204963

解析步骤

目前有2种思路

解析百度接口

通过调用 https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php 接口,拉取日历信息后再生成ics日历信息

def baiduContent(year):
    festival_lst = []
    # 因该接口传入的时间,查询了前一个月,当前月和后一个月的数据,所以只需要2、5、8、11即可全部获取到。比如查询5月份,则会查询4,5,6月分的数据
    months = ["2", "5", "8", "11"]

    for month in months:
        ts = int(time.time() * 1000)
        domain = "https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?tn=wisetpl&format=json&resource_id=39043&query="
        url = domain + str(year) + "年" + month + "月&t=" + str(ts)

        response = requests.get(url)
        content = response.text

        root = json.loads(content)
        almanac = root["data"][0]["almanac"]
        for item in almanac:
            if ('status' in item and item["status"] == '1'):
                current_date = convert_to_date(item["year"] + "年" + item["month"] + "月" + item["day"] + "日", year)
                festival = ''
                if ('term' in item):
                    festival = item["term"]
                fest = FestivalModel(current_date, festival, '', 1)
                festival_lst.append(fest)
            elif ('status' in item and item["status"] == '2'):
                current_date = convert_to_date(item["year"] + "年" + item["month"] + "月" + item["day"] + "日", year)
                festival = ''
                if ('term' in item):
                    festival = item["term"]
                fest = FestivalModel(current_date, festival, '', 2)
                festival_lst.append(fest)

解析法定节假日通知

通过访问 https://www.gov.cn/zhengce/content/202310/content_6911527.htm 页面,解析通知内容后再生成ics日历信息

def getfestival(year, content):
    festival_lst = []
    for item in content.split('\n'):
        if not item:
            item = ''
        item = item.strip()
        if item == "":
            continue

        if "放假," in item:
            idx1 = item.find('、')
            idx2 = item.find(':')
            idx3 = item.find('放假,')

            festival = item[idx1 + 1: idx2]
            date = item[idx2 + 1: idx3]

            if "、" in festival:
                festival_many = festival.split('、')
                festival = festival_many[1]

            appointed_date = convert_to_date(date, year)

            fest = FestivalModel(appointed_date, festival, '', 1)
            festival_lst.append(fest)

            # 处理与周末连休
            if "与周末连休" in item:
                weekday = appointed_date.weekday()
                if weekday == 0:
                    festival_sun = FestivalModel(appointed_date - timedelta(days=1), festival, '', 1)
                    festival_lst.append(festival_sun)
                    festival_sat = FestivalModel(appointed_date - timedelta(days=2), festival, '', 1)
                    festival_lst.append(festival_sat)
                elif weekday == 4:
                    festival_sat = FestivalModel(appointed_date + timedelta(days=1), festival, '', 1)
                    festival_lst.append(festival_sat)
                    festival_sun = FestivalModel(appointed_date + timedelta(days=2), festival, '', 1)
                    festival_lst.append(festival_sun)

        elif "放假调休," in item:
            idx1 = item.find('、')
            idx2 = item.find(':')
            idx3 = item.find('放假调休,')

            festival = item[idx1 + 1: idx2]
            date_range = item[idx2 + 1: idx3]

            if "、" in festival:
                festival_many = festival.split('、')
                festival = festival_many[1]

            # 处理10月1日至7日这样的日期
            date_continuous = date_range.split('至')
            start = date_continuous[0]
            end = date_continuous[1]
            if "月" not in end:
                end = start[0:start.find('月') + 1] + end
            start_date = convert_to_date(start, year)
            end_date = convert_to_date(end, year)
            current_date = start_date
            while current_date <= end_date:
                fest = FestivalModel(current_date, festival, '', 1)
                festival_lst.append(fest)
                current_date += timedelta(days=1)

            # 处理补班
            many_sentence = item.split('。')
            for single_sentence in many_sentence:
                if "上班" in single_sentence:
                    many_work = single_sentence.split('、')
                    for single_work in many_work:
                        left_bracket = single_work.find('(')
                        date_work = single_work[0:left_bracket]

                        fest = FestivalModel(convert_to_date(date_work, year), festival, '', 2)
                        festival_lst.append(fest)

生成步骤

通过上面的解析,得到节假日信息的数组,再遍历输出ics的内容

def getics(festival_lst, year):
    print("BEGIN:VCALENDAR")
    print("VERSION:2.0")
    print("X-WR-CALNAME:" + str(year) + "订阅法定节假日")
    print("X-APPLE-CALENDAR-COLOR:#FBD36A")
    print("X-WR-TIMEZONE:Asia/Shanghai")

    festival_lst = sorted(festival_lst, key=lambda x: x.dt)

    idx = 1
    for item in festival_lst:
        formatted_date = item.dt.strftime("%Y%m%d")
        print("BEGIN:VEVENT")
        print("UID:" + str(year) + "-" + f"{idx:04d}")
        print("DTSTART;VALUE=DATE:" + formatted_date)
        print("DTEND;VALUE=DATE:" + formatted_date)
        print("SUMMARY:" + item.festivalTips)
        print("SEQUENCE:0")
        print("BEGIN:VALARM")
        print("TRIGGER;VALUE=DATE-TIME:19760401T005545Z")
        print("ACTION:NONE")
        print("END:VALARM")
        print("END:VEVENT")

        idx += 1

    print("END:VCALENDAR")

效果预览

将生成的内容保存到ics上传服务器,即可供客户端使用。比如ios手机订阅日历

BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:2024订阅法定节假日
X-APPLE-CALENDAR-COLOR:#FBD36A
X-WR-TIMEZONE:Asia/Shanghai
BEGIN:VEVENT
UID:2024-0001
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240101
SUMMARY:元旦(休息)
SEQUENCE:0
BEGIN:VALARM
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
ACTION:NONE
END:VALARM
END:VEVENT
END:VCALENDAR

 

标签:item,festival,日历,print,生成,date,lst,year,ics
From: https://www.cnblogs.com/masonblog/p/17961971

相关文章

  • [RFC6238] TOTP: 基于时间的一次性密码生成算法
    原创 给我馍馍 给我馍馍 2019-03-2822:42在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正。 生活中我们会经常使用到TOTP的算法应用,如银行的动态口令器、网络游戏中的将军令、......
  • mybatis-generator:generate生成器将另外的数据库内同名表生成
     问题:在使用mybatis-generator:generate生成器时,会生成别的数据库内同表名;因为是相同表名。 解决:在生成器的配置文件中的数据库连接地址内添加:<!--放置生成其他库同名表--><propertyname="nullCatalogMeansCurrent"value="true"/>......
  • 生成式AI入门指南
    生成式人工智能技术使各类内容创作变得更加便捷,它能够接收多种形式的输入,如文字、图片、音频、动画、三维模型等,并据此生成全新的原创作品。生成式AI的定义生成式AI模型通过神经网络辨识现有数据中的规律和架构,从而创造出新的独特内容。这类模型的突破性进展之一在于,它们可以运用无......
  • 生成式AI技术有哪些应用场景
    生成式AI是简化创意人员、工程师、研究人员、科学家等工作流程的有力工具,其使用案例和可能性涵盖所有行业和个人。 生成式AI模型可以接收文本、图像、音频、视频和代码等输入,并将新内容生成成上述任何形式。例如,它将文本输入转换为图像,将图像转换为歌曲,或将视频转换为文本。 目前......
  • Agility Robotics和其他七家公司的类人机器人争夺工作岗位
    原创|文BFT机器人人形机器人何时会从研究项目过渡到商业产品?答案似乎是在2024年,届时一些资金充裕的公司将在商业试点项目中部署他们的机器人,以弄清楚人形机器人是否真的准备好投入工作。在2015年DARPA机器人挑战赛总决赛上亮相的机器人之一被称为ATRIAS,由俄勒冈州立大学动态机器......
  • AI赋能建筑设计 | VERYCLOUD睿鸿股份与亚马逊云科技协力为AIRI lab. 打造生成式AI应用
    近年来,很多研究都致力于探索如何让建筑师借助人工智能的力量来促进并简化设计流程。生成式AI全球爆火以来,建筑设计领域也掀起了一场全新的思维变革。AI为建筑设计带来更多可能作为一家面向全球提供设计服务的企业,AIRIlab.计划推出一种可以根据文字生成效果图的服务,为建筑设计师提......
  • SCA面面观 | 如何生成一份软件物料清单SBOM?
    由于网络安全挑战和不断变化的威胁环境,使得软件供应链安全成为了一个重要议题。特别是近年来,软件供应链的复杂性和全球化程度的提升,第三方软件的安全性和可追溯性变得越来越重要。为了应对这一挑战,从美国政府开始,各个国家开始积极推动软件供应链安全的相关政策和措施。美国陆续发布......
  • Python对Excel表格文件数据按条件加以筛选并生成直方图的方法
      本文介绍基于Python语言,读取Excel表格文件数据,以其中某一列数据的值为标准,对于这一列数据处于指定范围的所有行,再用其他几列数据的数值,加以数据筛选与剔除;同时,对筛选前、后的数据分别绘制若干直方图,并将结果数据导出保存为一个新的Excel表格文件的方法。  首先,我们来明确一......
  • 大语言模型LLM幻觉的解决方法:检索增强生成RAG
    当你向大语言模型LLMs集成的问答系统平台咨询医疗方面的问题,比如呼吸道感染应该怎么治疗,它可能直接给出答案,但不会提供这个答案的依据来源,这是因为大语言模型应用过程中还存在答案透明度不足的缺陷导致。此外,大语言模型还有知识更新的滞后性、在处理复杂任务时的准确性的问题。 ......
  • crontab 任务报错生成小文件及邮件告警处理
    CRONTAB服务不断发邮件问题解决问题背景操作系统:LinuxSuSe12ps5规格:4C8G现在描述:操作系统异常卡慢,甚至无法正常登录到服务器,服务器/var/log/messages的日志过大,撑爆了/var目录磁盘空间。/var/spool/postfix/maildrop目录不存在会导致一起调起sendmail与postdrop的......