当添加到日历时,ICS会根据时区调整日期。

问题描述 投票:0回答:1

我已经下载了一个PHP脚本,允许我为一个预定的网络研讨会生成可下载的ICS。日期& 时间设置为WP ACF帖子。另外,WordPress的时区被设置为AmericaLos_Angeles。但我的时区是基于PH的马尼拉。

下面是代码。

// 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文件以匹配用户的时区?

php wordpress icalendar
1个回答
0
投票

我想你还没有明确问的问题是时间的关系。

首先要注意的是,一个ics VTIMEZONE的目的是为了定义一个时区,即当实际的夏令时变化,它不是用来说该事件是在洛杉矶时间。 它实际上应该包含一系列的夏令时日期,如果DST在该时区是相关的。请看 https:/icalendar.orgiCalendar-RFC-55453-6-5-time-zone-component.html。

一个VTIMEZONE并没有说什么VEVENTS的开始和结束时间。

在这个文件中,事件的DTSTART是以UTC时间定义的(见Z?https:/icalendar.orgiCalendar-RFC-55453-3-5-date-time.html。 和这里的时间差https:/www.timeanddate.comworldclockmeetingdetails.html?year=2020&月=6&日=16&时=11&分=0&秒=0&p1=137&p2=145。

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

© www.soinside.com 2019 - 2024. All rights reserved.