【问题标题】:parsing ics file - recurring events timezone issue解析 ics 文件 - 重复事件时区问题
【发布时间】:2022-11-10 23:00:15
【问题描述】:

这是一个包含重复事件和非重复事件的 basic.ics 文件

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:GreekMan
X-WR-TIMEZONE:Asia/Nicosia
BEGIN:VTIMEZONE
TZID:Europe/Moscow
X-LIC-LOCATION:Europe/Moscow
BEGIN:STANDARD
TZOFFSETFROM:+0300
TZOFFSETTO:+0300
TZNAME:MSK
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VTIMEZONE
TZID:Asia/Nicosia
X-LIC-LOCATION:Asia/Nicosia
BEGIN:STANDARD
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
TZNAME:EET
DTSTART:19701025T040000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETFROM:+0200
TZOFFSETTO:+0300
TZNAME:EEST
DTSTART:19700329T030000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
END:VTIMEZONE

BEGIN:VEVENT
DTSTART:20221110T140000Z
DTEND:20221110T143000Z
DTSTAMP:20221110T093950Z
UID:52kaiifeon2cdil0m6ln6m4cf6@google.com
CREATED:20221110T091122Z
LAST-MODIFIED:20221110T091122Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:non recurring event 1600
TRANSP:OPAQUE
END:VEVENT

BEGIN:VEVENT
DTSTART;TZID=Asia/Nicosia:20221110T130000
DTEND;TZID=Asia/Nicosia:20221110T133000
RRULE:FREQ=WEEKLY;BYDAY=TH
DTSTAMP:20221110T093950Z
UID:4ponmapnn5o6bj0fep6kfplcf4@google.com
CREATED:20221110T091051Z
DESCRIPTION:
LAST-MODIFIED:20221110T091101Z
LOCATION:
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:recurring event 1300
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

我使用 wget 下载此文件并使用此命令将其转换为表格

awk 'BEGIN{FS=":"}/^DTSTART/{dtstart=$2}/^SUMMARY/{summary=$2}/^END:VEVENT/{print substr(dtstart,7,2)"/"substr(dtstart,5,2)"/"substr(dtstart,1,4),sprintf("%02d",substr(dtstart,10,2)'+2')":"substr(dtstart,12,2),summary}' basic.ics

这是输出。如您所见,重复事件显示的时间错误。

10/11/2022 16:00 non recurring event 1600
10/11/2022 15:00 recurring event 1300

谷歌日历以 UTC+0 显示时间,因此您可以在上面的命令中看到,我为每个事件添加 2 小时以使其成为 UTC+2。

问题是重复事件包括 DTSTART 上的时区,因此不必更正这些事件。

如何修改命令以避免重复事件增加 2 小时?

【问题讨论】:

  • 要使用时区,您可能需要对awkdate 等使用非标准扩展......目标操作系统是什么?
  • linux debian 11.5
  • 您的目的是在Asia/Nicosia 时区显示日期时间吗?
  • 这是正确的,是的

标签: bash awk


【解决方案1】:

以下代码应该适用于 Debian 10.5 (GNU awk 5.1.0):

gawk -F '[;:]' '
    /^DTSTART/ {
        Y = substr($NF,1,4)
        m = substr($NF,5,2)
        d = substr($NF,7,2)
        H = substr($NF,10,2)
        M = substr($NF,12,2)
        S = substr($NF,14,2)
        datespec = sprintf("%s %s %s %s %s %s", Y, m, d, H, M, S)

        ENVIRON["TZ"] = (NF == 4 ? $3 : "UTC")
        timestamp = mktime(datespec)

        ENVIRON["TZ"] = "Asia/Nicosia"
        date = strftime("%Y-%m-%dT%H:%M:%S%z",timestamp)
    }
    /^SUMMARY/ { summary = $NF }
    /^END:VEVENT/ { print date, summary }
'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2013-01-25
    • 2017-04-14
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多