【问题标题】:Export .ics file from Oulook appearing datetime in different timezone从不同时区显示日期时间的 Outlook 导出 .ics 文件
【发布时间】: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"

我不知道为什么startdatetimeend_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 文件

标签: php icalendar


【解决方案1】:

我得到了答案。

$ics =  "BEGIN:VCALENDAR\n";
$ics .= "PRODID:-//F4WD TM//NONSGML F4WD//EN\n";
$ics .= "VERSION:2.0\n";
$ics .= "CALSCALE:GREGORIAN\n";
$ics .= "METHOD:PUBLISH\n"; // requied by Outlook
$ics .= "X-WR-CALNAME:\n";
$ics .= "TZ:+00:\n";
$ics .= "BEGIN:VEVENT\n";
$ics .= "CLASS:PUBLIC\n";
$ics .= "CREATED:".date('Ymd', strtotime($v['start_datetime'])).'T'.date('His', strtotime($v['start_datetime']))."Z\n"; 
$ics .= "DTEND;TZID=UTC:".date('Ymd', strtotime($v['end_datetime'])).'T'.date('His', strtotime($v['end_datetime']))."Z\n"; 
$ics .= "DTSTAMP:".date('Ymd').'T'.date('His')."Z\n"; 
$ics .= "DTSTART;TZID=UTC:".date('Ymd', strtotime($v['start_datetime'])).'T'.date('His', strtotime($v['start_datetime']))."\n";
$ics .= "LAST-MODIFIED:".date('Ymd', strtotime($v['start_datetime'])).'T'.date('His', strtotime($v['start_datetime']))."\n"; 
$ics .= "SEQUENCE: 0\n";
$ics .= "SUMMARY: ".$v['title']. "\n";
$ics .= "TRANSP:OPAQUE \n";
$ics .= "UID:".date('Ymd').'T'.date('His')."-".rand()."-".$domain_url."\n"; 
$ics .= "DESCRIPTION:".$v['description']."\n";
$ics .= "X-MICROSOFT-CDO-BUSYSTATUS:BUSY".$v['status']."\n";
$ics .= "END:VEVENT\n";
$ics .= "END:VCALENDAR\n";

我没有将 ;TZID=UTCDTSTARTDTEND 一起使用。所以现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多