如何使用UTC偏移量而非时区名称创建iCal文件?
当然可以!完全不需要依赖时区名称,只用你数据库里的UTC时间和时区偏移量就能生成符合标准的ICS文件,下面给你两种靠谱的实现方法:
方法一:直接使用UTC时间(最省心)
这种方式不需要做任何时间计算,直接把数据库里的UTC时间转换成ICS规定的UTC格式即可。ICS里的UTC时间格式是YYYYMMDDTHHMMSSZ,其中Z是UTC的标识。
比如你的示例数据:
event_start:2017-12-25 10:00:00(UTC)event_end:2017-12-25 20:00:00(UTC)
转换成ICS字段就是:
DTSTART:20171225T100000Z DTEND:20171225T200000Z
日历客户端会自动根据用户的本地时区,把这个UTC时间转换成对应的本地时间显示,兼容性拉满。
方法二:转换为带偏移量的本地时间(明确记录当地时间)
如果你希望ICS里直接记录事件的当地时间(比如示例中UTC+1时区的11点开始),可以把UTC时间加上时区偏移量,转换成带偏移的格式写入ICS。
ICS支持的带偏移时间格式是YYYYMMDDTHHMMSS±HHMM(注意偏移量要去掉冒号,比如+01:00要改成+0100)。
以你的示例为例:
- 计算当地时间:UTC 10:00:00 + 01:00 = 11:00:00,UTC 20:00:00 + 01:00 = 21:00:00
- 转换成ICS格式:
20171225T110000+0100和20171225T210000+0100
对应的ICS字段可以写成两种形式(都符合标准):
形式一:直接在时间后加偏移量(推荐)
DTSTART:20171225T110000+0100 DTEND:20171225T210000+0100
形式二:用TZID指定偏移量(部分旧客户端可能更友好)
DTSTART;TZID=+0100:20171225T110000 DTEND;TZID=+0100:20171225T210000
注意事项:
- 偏移量的正负别搞反:
+HHMM表示比UTC快,-HHMM表示比UTC慢,计算时间时要对应加减。 - 格式要严格:日期和时间之间用
T分隔,不能有空格;偏移量必须是4位数字(比如+0100不能写成+100)。
这两种方法都符合ICS的RFC 5545标准,主流日历客户端(Google Calendar、Apple Calendar、Outlook等)都能完美识别,完全不用担心兼容性问题。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

