【发布时间】:2016-04-05 21:55:28
【问题描述】:
我在我的项目中使用 icalendar。我的应用程序中有一些权限,用户可以生成和导出 .ics 文件并导入到 Outlook 中。在 Outlook 中,用户可以添加一些事件,还可以生成 .ics 文件并导入日历。问题是当用户导出 .ics 文件然后文件包含以下数据时:
"start_datetime" => "2016-04-06 18:00:00" //UTC Time
"end_datetime" => "2016-04-06 18:30:00" //UTC Time
"status" => null
"title" => "Free"
"description" => ""
"from" => "Dr Demo xprt02"
当用户将该文件导入 Outlook 时,再次从 Outlook 导出并导入回应用程序,然后 .ics 返回:
array:11 [▼
"CLASS" => "PUBLIC"
"CREATED" => "20160405T073709Z"
"DTEND" => "20160406T130000Z"
"DTSTAMP" => "20160405T020700Z"
"DTSTART" => "20160406T123000Z"
"LAST-MODIFIED" => "20160405T073709Z"
"SEQUENCE" => "0"
"SUMMARY" => " Free"
"TRANSP" => "OPAQUE"
"UID" => "20160405T073649-31540-f4wd.com"
"X-MICROSOFT-CDO-BUSYSTATUS" => "BUSY"
]
将 .ics 内容转换为 php 后,我得到了。
"start_datetime" => "2016-04-06 12:30:00"
"end_datetime" => "2016-04-06 13:00:00"
"status" => null
"title" => "Free"
"description" => ""
"from" => "Dr Demo xprt02"
我不知道为什么startdatetime 和end_datetime 在从outlook 获取相同的文件后会有这样的差异。我认为前景不会在 UTC 中返回。如果有人有任何想法,请分享。
【问题讨论】:
-
你必须显示ics内容,而不是转换后的php。肯定是时区问题。
-
首先,我建议你比较真实的ics文件(文本文件,用基本的文本编辑器打开它(见here示例格式),然后用原始的ics文件(不是由您的程序创建),将其导入outlook,然后将其导出以查看行为是否相同。然后您可以了解问题是来自您的脚本还是来自outlook。
-
@fusion3k,我已经做到了。在引用 .ics 文件(从 Outlook 导出)后,我在脚本中使用了一些列,例如“CLASS”=>“PUBLIC、X-MICROSOFT-CDO-BUSYSTATUS 等”。
-
我不认为我们可以通过这种方法找到解决方案。原始文件没有数组,它类似于“BEGIN:VEVENT Summary:...”。您必须在ics tech specs 之后调查您生成的文件是否正确。也有助于查看您的代码并了解您使用什么库来生成 ics 文件