日历标准格式
ics文件
.ics这一扩展名指的是iCalendar(“日历数据交换标准”)文件格式和文件类型,是一种用于保存和交换日历信息的标准格式。iCalendar格式不依赖于任何网络协议,因此通过现有的各种服务(如HTTP、电子邮件、WebDAV等)就可以对日历数据进行交换和更新。
.ics文件通常是纯文本文件,可通过文本编辑程序打开和浏览。文件中包含日程表事件的数据,这些数据通过一个具有语义结构的基于XML的代码表示。.ics文件允许记录、交换、导入和更新可用的日期和时间,且允许在不改变待办事项清单的前提下预定和取消预约及计划。
BEGIN:VCALENDAR # 日历开始
PRODID:-//139 Mail//calendar 2.3//EN # 软件信息
VERSION:2.0 # 遵循的iCalendar版本号
CALSCALE:GREGORIAN # 历法:公历
BEGIN:VEVENT # 事件开始
DTSTAMP:20230411T031706Z # 有 Method 属性时表示实例创建时间,没有时表示最后修订的日期时间
DTSTART:20230410T000000 # 开始的时间
DTEND:20230411T000000 # 结束的时间
SUMMARY:每周提醒,测试 # 简介、标题
LOCATION:地点 # 地点
DESCRIPTION:备注L提前15分钟 # 事件的描述
X-ALLDAY:1 # 是否是全天事件
UID:10-414111111-1591111111@139.com # 唯一标识
ORGANIZER:mailto:1591111111@139.com # 组织者
ATTENDEE;CN=11111@outlook.com;RSVP=TRUE:mailto:11111@outlook.com
ATTENDEE;CN=1111111@qq.com;RSVP=TRUE:mailto:1111111@qq.com
RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR
X-REQMY:EMAIL
BEGIN:VALARM # alarm组件开始
TRIGGER:-PT15M # 提前15分钟提醒
REPEAT:1
DURATION:PT1M
SUMMARY:每周提醒,测试
ACTION:DISPLAY # 在ACTION:DISPLAY时,预期的效果是向用户显示“DESCRIPTION”属性的文本值。
DESCRIPTION:每周提醒,测试
END:VALARM # alarm结束
END:VEVENT # 事件结束
END:VCALENDAR # 日历结束
创建ics文件
导包
from icalendar import Calendar, Event, Alarm
from datetime import datetime
from pytz import UTC # timezone
import calendar
import time
import random
cal = Calendar()
cal.add('version', '2.0')
cal.add('prodid', '-//SWM's Calendar//SWM//CN')
event = Event()
# 当前时间
now_time = datetime(
time.localtime()[0],
time.localtime()[1],
time.localtime()[2],
time.localtime()[3],
time.localtime()[4],
time.localtime()[5],
tzinfo=UTC)
# 时间戳
event.add('dtstamp', now_time)
# 开始时间
event.add('dtstart', datetime(2022,4,4,tzinfo=UTC))
# 结束时间
event.add('dtend', datetime(2022,4,5,tzinfo=UTC))
event.add('X-ALLDAY', 1)
# 事件名
event.add('summary', '事件名')
event.add('description','详情描述')
tmp_t = time.strftime("%Y%m%d%H%M", time.localtime())
print(tmp_t)
event['uid'] = tmp_t+'@SWM'
freq_of_recurrence = 'DAILY'
event.add('rrule', { 'FREQ': freq_of_recurrence, 'INTERVAL': 2})
alarm = Alarm()
alarm.add("action", "DISPLAY")
alarm.add('description', "Reminder")
#alarm.add("trigger", datetime.timedelta(hours=-reminderHours))
# The only way to convince Outlook to do it correctly
reminderM = 10 # 提前10分钟提醒
alarm.add("TRIGGER;RELATED=START", "-PT{0}M".format(reminderM))
event.add_component(alarm)
cal.add_component(event)
f = open('example.ics', 'wb')
f.write(cal.to_ical())
f.close()