将时间戳转换为.ics iCal兼容日期格式

时间:2012-08-03 10:22:45

标签: php icalendar

我有一个日期,我通过jQuery中的formatDate函数存储为时间戳。我正在重新获取此值以生成一个ics文件,一个日历文件,将事件时间和详细信息添加到用户日历。但是,时间戳格式在ics文件中不起作用,没有添加正确的日期,因此我需要将其转换为看起来像20091109T101015Z的值。它的当前格式为时间戳,如1344466800000这来自this example,这是我要创建的ics文件。

我的php文件链接是http:// domain。 COM / icsCreator.php的startDate = 1344380400000&安培;结束日期= 1345503600000&安培;事件=空间%20Weather%20Workshop&安培;位置=伦敦

目前我的ics文件看起来像

<?php
$dtStart=$_GET['startDate'];
$dtEnd=$_GET['endDate'];
$eventName=$_GET['event'];
$location=$_GET['location'];

...
echo "CREATED:20091109T101015Z\n";
echo "DESCRIPTION:$eventName\n";
echo "DTEND:$dtEnd\n";    
echo "DTSTART:".$dtStart."\n";
echo "LAST-MODIFIED:20091109T101015Z\n";
echo "LOCATION:$location\n";
...

?>

2 个答案:

答案 0 :(得分:5)

看看是否有效:

date('Ymd\THis', $time)

此处$time可能来自您的查询字符串startDateendDate。如果你不想要时间:

date('Ymd', $time)

注意(感谢Nicola)这里,$time必须是有效的UNIX时间戳,即它必须代表自纪元以来的秒数。如果它表示毫秒数,则需要先将其除以1000。

编辑正如 lars k 所指出,您需要在两个字符串的末尾添加\Z

编辑正如 Nicola 指出的那样,你真的不需要它。

答案 1 :(得分:4)

\ Z告诉系统时区。 Z是Zulu或环球时间。

如果你不加考虑 - 那么你假设最终用户日历应用程序的时区设置与生成时间戳的系统的时区设置相匹配。

仅在美国就有多个时区 - 因此您无法根据您的用户与您在同一个国家/地区进行此假设。

为了使日期正确进入日历,您需要指定UTC的时区偏移量加上或减去小时和分钟

注意:     日期(&#39; Ymd \ THisP&#39;); // P是对GMT的偏移量,应该适用于所有日历目的。

从格林威治标准时间开始1小时的转变就会出现这样的情况

20150601T10:38+01:00

在PHP中使用日期时,最好使用DateTime对象,然后您可以轻松使用并更改timezones

// Start with your local timezone e.g
$timezone = new \DateTimeZone('Europe/Amsterdam') ; 

// Don't be tempted to use a timezone abbreviation like EST
// That could mean Eastern Standard Time for USA or Australia.
// Use a full timezone: http://php.net/manual/en/timezones.php

$eventdate = new DateTime ( '1st September 2015 10:30', $timezone);

// Convert the time to Universal Time
$eventdate->setTimezone( new DateTimeZone('UTC') ) ; // Universal / Zulu time

// Return Event Date/Time in calendar ICS friendly format 
// comfortable in the knowledge that it is really in UTC time
return $eventdate->format('Ymd\THis\Z') ;
相关问题