1

我有一个从网络日历 ICS 文件解析的 ISO DATETIME 格式。我在 google 和 yahoo 中创建了日历事件。在谷歌中,我创建了 IST 11:00 到 11:30 的时间。在雅虎,我在 IST 11:30 到 11:45 的时间创建。

我已收到这两个事件的 ICS 文件。我的问题是 ICS 文件中的事件开始时间和结束时间。

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

雅虎开始时间——20140218T113000Z(提供当地时间)

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

4

3 回答 3

1

您可以使用的 ical 文件中应该有一个时区声明。

RFC将其放在 上DTSTART,例如:

DTSTART;TZID=America/New_York:19980119T020000

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

X-WR-TIMEZONE:Europe/Berlin

仅在 ical 文件中显示一次。

创建 DateTime 对象后,您可以使用 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";
于 2014-02-18T08:05:13.550 回答
0

正如 Gerald 指出的那样,差异来自这样一个事实,即事件的DTSTART(以及顺便说一句DTEND)属性被显式引用(根据RFC 5545 - time zone identifierX-WR-TIMEZONE )或通过(Apple iCal)隐式引用。

在第一种情况下,您必须处理VTIMEZONE组件(RFC5545 - VTIMEZONE 组件)。为此,您将需要一个支持时区的 PHP 中的 ICalendar 解析器

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

但是,您可能应该阅读 J. Dunnell 的这篇博客文章X-WR-TIMEZONE,内容是在开始这段旅程之前可能遇到的处理陷阱......

于 2014-02-18T13:19:50.433 回答
-1

您可以在 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("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

于 2014-02-18T07:52:00.210 回答