我有一个从网络日历ICS文件解析的ISO DATETIME格式。我在谷歌和雅虎中创建了日历事件。在谷歌中,我创建了 11:00 到 11:30 IST 的时间。在雅虎中,我创建了 11:30 到 11:45 IST 的时间。
我收到了这两个事件的 ICS 文件。我的问题是ICS文件中的事件开始时间和结束时间。
谷歌开始时间 - 20140218T060000Z(提供格林威治标准时间)
雅虎开始时间 - 20140218T113000Z(提供本地时间)
如何检查 ISO 日期时间中的时区是否为 GMT,如果不是,则将其转换为 GMT?请帮助我实现这一目标。提前谢谢。
的 ical 文件中应该有一个时区声明。
RFC将其放在DTSTART
上,例如:
DTSTART;TZID=America/New_York:19980119T020000
但 ical 并不是一门非常精确的"科学",似乎每个人使用它的方式都不同。我见过这样的时区声明:
X-WR-TIMEZONE:Europe/Berlin
在 ical 文件中只出现一次。
创建日期时间对象后,可以使用 DateTime::setTimezone 来设置它。PHP 文档中的示例:
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "n";
正如Gerald指出的那样,区别来自于这样一个事实,即事件的DTSTART
(顺便说一下,还有DTEND
)属性被显式引用(根据RFC 5545 - 时区标识符)或通过X-WR-TIMEZONE
(Apple iCal)隐式引用。
在第一种情况下,您必须处理VTIMEZONE
组件(RFC5545 - VTIMEZONE 组件)。为此,您将需要一个支持时区的 PHP 中的 ICalendar 解析器
在第二种情况下,您必须参考 Olson 数据库,并且可能需要使用 timezonedb 而不是默认的 php 数据库。
但是,您可能应该阅读J. Dunnell的这篇博客文章,了解在开始这段旅程之前处理X-WR-TIMEZONE
的可能陷阱......
你可以在php中使用date
和strtotime
函数。
说
// apply this to all your times
$start_time = "20140218T060000Z";
$timeZone = date("e",strtotime($start_time));
if($timeZone != "UTC"){ // UTC is same as GMT in case you're wondering
$start_time_gmt = gmdate("YmdTHisZ",$start_time); // the T an Z are key characters for the date function so you need to escape them if you want to display it in that format
}
引用:http://www.php.net/manual/en/function.date.php
http://php.net/strtotime