PHP中的ISO日期时间

时间:2014-02-18 07:36:10

标签: php datetime timezone icalendar rfc5545

我有从Web日历ICS文件解析的ISO DATETIME格式。我在谷歌和雅虎创建了日历活动。在Google中,我创建的时间是11:00到11:30 IST。 在雅虎,我创建的时间是11:30到11:45 IST。

我收到了两个活动的ICS文件。我的问题在于ICS文件中的事件开始时间和结束时间。

Google开始时间 - 20140218T060000Z(提供GMT时间)

Yahoo开始时间 - 20140218T113000Z(提供当地时间)

如何检查ISO日期时间中的时区是否为GMT,如果不是,则将其转换为GMT?请帮我实现这个目标。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用的文件中有时区声明。

The RFC将其放在DTSTART上,例如:

DTSTART;TZID=America/New_York:19980119T020000

但是ical不是一个非常精确的“科学”,似乎每个人都使用它不同。我见过这样的时区声明:

X-WR-TIMEZONE:Europe/Berlin

仅在ical文件中显示一次。

创建DateTime对象后,可以使用DateTime :: setTimezone来设置它。 PHP documentation的示例:

$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";

答案 1 :(得分:0)

正如Gerald所指出的,差异来自于事件的DTSTART(以及DTEND)属性被明确引用(根据RFC 5545 - time zone identifier)或隐含地通过X-WR-TIMEZONE(Apple iCal)。

在第一种情况下,您必须处理VTIMEZONE组件(RFC5545 - VTIMEZONE component)。为此您需要ICalendar parser in PHP that supports timezones

在第二种情况下,您必须引用Olson database,并且可能需要使用timezonedb而不是默认的php。

然而,在开始这段旅程之前,您应该阅读J. Dunnell关于处理X-WR-TIMEZONE的可能陷阱的blog条目......

答案 2 :(得分:-1)

您可以使用php中的datestrtotime函数。

  // 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("Ymd\THis\Z",$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