1

我试图允许用户在 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();
4

1 回答 1

2

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

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

于 2016-05-17T07:46:17.260 回答