【问题标题】:iCal Time Zone issueiCal 时区问题
【发布时间】:2016-09-12 07:44:35
【问题描述】:

我正在尝试允许用户在 ASP.Net 中为他们的日历下载 iCal,但遇到了时区问题。

如果我将文件下载到我的计算机上,则时间显示正确且在正确的时间范围内。但是,当我尝试在手机上下载它时,时区会切换,并且会晚 5 小时(也就是早上 7:00 变成凌晨 3:00)。

有谁知道如何解决这个问题/设置时区?

代码如下:

        iCalendar iCal = new iCalendar();

        Event evt = iCal.Create<Event>();

        DateTime dt = (DateTime)Convert.ToDateTime(lblTicketDue.Text);

        Console.Write(dt);

        evt.Start = new iCalDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
        evt.End = new iCalDateTime((DateTime)Convert.ToDateTime(lblTicketDue.Text).AddMinutes(15.0));
        Alarm alarm = new Alarm();
        alarm.Action = AlarmAction.Display;
        alarm.Summary = "Ticket due!";
        Trigger t = new Trigger();
        iCalDateTime icdt = new iCalDateTime(dt.Subtract(TimeSpan.FromMinutes(120.0)));
        t.DateTime = icdt;
        alarm.Trigger = t;


        evt.Alarms.Add(alarm);
        iCal.Events.Add(evt);

        iCalendarSerializer serializer = new iCalendarSerializer();
        string output = serializer.SerializeToString(iCal);

        Response.ContentType = "text/calendar";
        Response.Write(output);
        Response.End();

【问题讨论】:

    标签: c# asp.net time icalendar dday


    【解决方案1】:

    如果不查看生成的实际 iCalendar 流很难判断,但很可能您正在使用浮动时间生成 DTSTART/DTEND(例如 "20160517T070000" )。 如果事件没有重复发生(没有 RRULE),您要做的是将您的日期时间转换为 UTC 并使用https://www.rfc-editor.org/rfc/rfc5545#section-3.3.5 中描述的“日期与 UTC 时间”格式 即类似“20160517Txx0000Z”

    如果事件重复发生,则需要使用最后一种形式(带有本地时间和时区参考的日期)。

    【讨论】:

    • iCalendar 的 DDay 对象版本不是首选的处理方式吗?我应该改为写入流吗?
    • 我不熟悉那个特定的 API,但如果它不允许您执行我上面描述的操作,我会感到非常惊讶。
    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多