来自Google日历的.ics导出时间错误

时间:2016-03-28 20:04:14

标签: php import icalendar

使用PHP,mysql,我正在尝试从/向Google日历导出/导入日历数据。 导入(到谷歌)工作正常。我可以从我的mysql表中导出数据并创建一个ics文件,然后使用特定的时区将其导入Google日历。

问题是当我导出数据时...... Google会更改每个事件的时区。我举一个例子。

当我将数据导入Google日历时,典型事件如下所示:

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 。一切都很好,我看到一个事件从凌晨3:30开始到凌晨4:30结束。

当我从Google导出我的日历时,此事件如下所示:

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

StartTime 003000 EndTime 013000

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为,由于您可以将日期/时间插入数据库,因此您可以解析DTSTART的格式。如果没有,我建议您查看sabre/vobject以获取完整的iCalendar解析器。

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

$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的主要作者。