从 Google 日历导出的 .ics 时间错误
.ics export from Google calendar has wrong time
使用 PHP、mysql,我正在尝试 export/import 日历数据 from/to Google 日历。
导入(到 Google)工作正常。我可以从 mysql table 导出数据并创建一个 ics 文件,然后使用特定时区将其导入 Google 日历。
问题是当我导出数据时...Google 更改每个事件的时区。我举个例子。
当我将数据导入 Google Calender 时,典型事件如下所示:
BEGIN:VEVENT
UID:20
DTSTAMP:20160328T222128
DTSTART:20160328T033000
DTEND:20160328T043000
LOCATION:
DESCRIPTION:My description here
SUMMARY:Event number 3
END:VEVENT
开始时间为 033000,结束时间为 043000。一切都很好,我看到一个事件从 3:30am 开始到 4:30am 结束。
当我从 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
开始时间003000结束时间013000
两个 .ics 文件都有 X-WR-TIMEZONE:Europe/Athens
为什么 Google 将我送回祖鲁时间,而不是我在日历中看到的时间?
我不想处理时区。这意味着如果来自美国的人将 .ics 文件上传到我正在制作的自定义日历,它会在数据库中插入错误的时间。 Google 日历是否可以精确导出一个人在其日历中看到的时间?
如果我无法避免这种情况,那么将此 Z 时间转换为本征时间的最简单方法是什么? (此人在 Google 日历中看到的时间)
谢谢!
我假设,由于您能够将 date/times 插入数据库,因此您能够解析 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 的主要作者。
使用 PHP、mysql,我正在尝试 export/import 日历数据 from/to Google 日历。 导入(到 Google)工作正常。我可以从 mysql table 导出数据并创建一个 ics 文件,然后使用特定时区将其导入 Google 日历。
问题是当我导出数据时...Google 更改每个事件的时区。我举个例子。
当我将数据导入 Google Calender 时,典型事件如下所示:
BEGIN:VEVENT
UID:20
DTSTAMP:20160328T222128
DTSTART:20160328T033000
DTEND:20160328T043000
LOCATION:
DESCRIPTION:My description here
SUMMARY:Event number 3
END:VEVENT
开始时间为 033000,结束时间为 043000。一切都很好,我看到一个事件从 3:30am 开始到 4:30am 结束。
当我从 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
开始时间003000结束时间013000
两个 .ics 文件都有 X-WR-TIMEZONE:Europe/Athens
为什么 Google 将我送回祖鲁时间,而不是我在日历中看到的时间? 我不想处理时区。这意味着如果来自美国的人将 .ics 文件上传到我正在制作的自定义日历,它会在数据库中插入错误的时间。 Google 日历是否可以精确导出一个人在其日历中看到的时间?
如果我无法避免这种情况,那么将此 Z 时间转换为本征时间的最简单方法是什么? (此人在 Google 日历中看到的时间)
谢谢!
我假设,由于您能够将 date/times 插入数据库,因此您能够解析 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 的主要作者。