ICS 将根据时区添加到日历时调整日期

ICS will adjust date when add to calendar base on timezone

我已经下载了一个 PHP 脚本,它允许我为预定的网络研讨会生成可下载的 ICS。日期和时间设置为 WP ACF post。此外,WordPress 时区设置为 America/Los_Angeles。但我的时区位于菲律宾马尼拉。

这是代码。

// ACF Date
$wdate = get_sub_field('date'); // Tuesday, June 16, 2020
$stime = get_sub_field('start_time'); // 11:00 am
$etime = get_sub_field('end_time'); // 11:30 am

// Prepare Date using date_i18n()
// Starting DateTime
$st_gmt = $wdate.' '.$stime;
$st = get_date_from_gmt($st_gmt, 'Y-m-d H:i:s');
$date_start = date_i18n(get_option('date_format').' '.get_option('time_format'), strtotime($st));
// Output: June 16, 2020 11:00 AM

// Ending DateTime
$et_gmt = $wdate.' '.$etime;
$et = get_date_from_gmt($et_gmt, 'Y-m-d H:i:s');
$date_end = date_i18n(get_option('date_format').' '.get_option('time_format'), strtotime($et));
// Output: June 16, 2020 11:30 AM

每当我测试下载 .ics 日历文件时,它应该是 June 17, 2020 2:00 AM & June 17, 2020 2:30 AM 但输出总是设置为 June 16, 2020 7:00 PM & June 16, 2020 7:30 PM 因为我来自菲律宾马尼拉,而事件设置为洛杉矶。

这是实际 ICS 文件的输出。

BEGIN:VCALENDAR
VERSION:2.0
X-WR-TIMEZONE:America/Los_Angeles
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:America/Los_Angeles
END:VTIMEZONE
BEGIN:VEVENT
LOCATION:Webinar Zoom
DESCRIPTION:This is my description
DTSTART:20200616T110000Z
DTEND:20200616T113000Z
SUMMARY:This is my summary
URL;VALUE=URI:
DTSTAMP:20200603T051015Z
UID:5ed6c0375fbf6
END:VEVENT
END:VCALENDAR

问题:当用户下载文件并添加到他们的日历时,如何输出 ics 文件以匹配用户时区?

我假设您尚未明确提出的问题是时间如何关联。

首先请注意,ics VTIMEZONE 用于时区定义,即当实际夏令时发生变化时,它不用于表示事件发生在洛杉矶时间。如果 DST 在该时区相关,它实际上应该包含一系列夏令时日期。参见 https://icalendar.org/iCalendar-RFC-5545/3-6-5-time-zone-component.html

VTIMEZONE 没有说明 VEVENTS 的开始和结束时间。

在此文件中,事件 DTSTART 定义为 UTC 时间(见 Z?)上午 11 点 这相当于凌晨 4 点的洛杉矶和晚上 7 点的马尼拉。 请参阅 DATETIME 的表格 2: https://icalendar.org/iCalendar-RFC-5545/3-3-5-date-time.html
这里是时差 https://www.timeanddate.com/worldclock/meetingdetails.html?year=2020&month=6&day=16&hour=11&min=0&sec=0&p1=137&p2=145

时间在应用程序中的显示方式取决于用户和应用程序的时区。应用程序应将 ics 事件时间转换为用户时区。