从谷歌日历导出的.ics有错误的时间


.ics export from Google calendar has wrong time

使用PHP、mysql,我试图将日历数据从谷歌日历导出/导入谷歌日历。导入(到谷歌)效果很好。我可以从mysql表中导出数据,创建一个ics文件,然后使用特定的时区将其导入谷歌日历。

问题是当我导出数据时。。。谷歌会更改每个活动的时区。我举一个例子。

当我将数据导入谷歌日历时,一个典型的事件如下:

BEGIN:VEVENT
UID:20
DTSTAMP:20160328T222128
DTSTART:20160328T033000
DTEND:20160328T043000
LOCATION:
DESCRIPTION:My description here
SUMMARY:Event number 3
END:VEVENT

StartTime为033000,EndTime为043000

当我从谷歌导出我的日历时,这个事件看起来像这样:

BEGIN:VEVENT
DTSTART:20160328T003000Z
DTEND:20160328T013000Z
DTSTAMP:20160328T194501Z
UID:20
CREATED:20160328T224357Z
DESCRIPTION:My description here
LAST-MODIFIED:20160328T194410Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Event number 3
TRANSP:OPAQUE
END:VEVENT

开始时间003000结束时间013000

两个.ics文件都有X-WR-TIMEZONE:欧洲/雅典

谷歌到底为什么要把祖鲁人的时间发给我,而不是我在日历上看到的时间?我不想处理时区。这意味着,如果Usa的人将.ics文件上传到我正在制作的自定义日历中,它会在数据库中插入错误的时间。谷歌日历有可能准确导出一个人在日历中看到的时间吗?

如果我无法避免这种情况,将Z时间转换为正确时间的最简单方法是什么?(人们在谷歌日历中看到的时间)

谢谢!

我假设,由于您能够将日期/时间插入数据库,因此您能够解析DTSTART的格式。如果没有,我建议查看sapper/vobject以获得完整的iCalendar解析器。

因此,在解析DTSTART之后,请确保将其解析为phpDateTime对象。这个对象可以很容易地转换到不同的时区:

$dt = new 'DateTime($input);
$dt->setTimeZone(new DateTimeZone('Europe/Athens'));

之后,您的$dt包含您的开始时间,转换为您的时区。

下面是vobject的一个例子:

$cal = Sabre'VObject'Reader::read($iCalendarData);
// DTSTART property
$dtstart = $cal->VEVENT->DTSTART;
// Turn into DateTime object
$dateTime = $dtstart->getDateTime();
// Convert to your timezone
$newDateTime = $dateTime->setTimeZone('Europe/Athens');

免责声明:我是vobject的主要作者。