根据 的时区设置开始和结束时间.伊卡文件

本文关键字:时间 文件 结束 时区 设置 开始 根据 | 更新日期: 2023-09-27 18:31:16

我正在使用 C# 代码生成.ics文件,以将我的事件添加到 Outlook 日历中。

.ics文件使用以下代码生成正常。但是我在这里有一个问题,那就是根据时区设置开始/结束时间。对于考试,我有新加坡标准时间开始/结束时间.ics文件。我希望如果有人在新加坡打开文件,那么它应该显示新加坡时间,如果有人在印度打开它,那么它应该显示印度时间。像 2012-04-20 13:00 这个时候在印度将是 10:30am 所以.ics文件显示 10:30 作为开始时间,如果.ics文件在印度操作.

我希望开始和结束时间应该根据系统的时区。 那么下面的代码有什么问题,它不起作用。

请帮忙。

法典:

DateTime StartTime = DateTime.Parse("2012-04-20 13:00:00.000Z");//Singapore Standard Time
DateTime EndTime = DateTime.Parse("2012-04-20 14:00:00.000Z");//Singapore Standard Time
bool UseAlarm = true;
                    StringBuilder sb = new StringBuilder(450);
                    sb.Append("BEGIN:VCALENDAR'n");
                    sb.Append("BEGIN:VEVENT'n'n");
                    sb.Append("DTSTART:");
                    sb.Append(StartTime.ToString("yyyyMMdd''THHmmss''Z"));
                    sb.Append("'nDTEND:");
                    sb.Append(EndTime.ToString("yyyyMMdd''THHmmss''Z"));
                    sb.Append("'nLOCATION:");
                    sb.Append("Location"); 
                    sb.Append("'nCATEGORIES:");
                    sb.Append(string.Empty);
                    sb.Append("'nTRANSP:OPAQUE'n");
                    sb.Append("SEQUENCE:0'n");
                    sb.AppendFormat("UID:RFCALITEM{0}'n", DateTime.Now.Ticks); 
                    sb.Append("DTSTAMP:");
                    sb.Append(StartTime.ToString("yyyyMMdd''THHmmss''Z"));
                    sb.Append("'nX-ALT-DESC;FMTTYPE=text/html:");//
                    sb.Append("This is just for testing."); 
                    sb.Append("'nSUMMARY:");
                    sb.Append("Title:Test ICS File"); 
                    sb.Append("'n'nPRIORITY:");
                    sb.Append(5);
                    sb.Append("'nCLASS:PUBLIC'n");
                    if (UseAlarm)
                    {
                        sb.Append("BEGIN:VALARM'n");
                        sb.Append("TRIGGER:PT15M'n");
                        sb.Append("ACTION:DISPLAY'n");
                        sb.Append("DESCRIPTION:Reminder'n");
                        sb.Append("PRIORITY:5'n");
                        sb.Append("END:VALARM'n");
                    }
                    sb.Append("END:VEVENT'n"); 
                    sb.Append("END:VCALENDAR");

根据 的时区设置开始和结束时间.伊卡文件

我不想把我的生命押在 Outlook 如何处理 iCal 数据上,所以这一切都不能保证......但是,代码中存在一些误解:

//Singapore Standard Time
DateTime StartTime = DateTime.Parse("2012-04-20 13:00:00.000Z");

这里的"Z"表示"祖鲁时间" - 因此DateTime.Parse将其解释为 UTC 值,然后将其转换为运行代码的系统上的本地时间。因此,例如,在我的机器上(英国时间,即 2012 年 4 月 20 日的 UTC+1),这将创建一个时间为 14:00 的DateTime值。

如果您希望将值解析为本地日期/时间,则不应在此处使用"Z"。

当你值时,你可以(IIRC - 我已经有一段时间没有做过任何iCal工作了)用三种方式之一表示日期/时间:

  • 作为 UTC 值,通过包含"Z"(就像您目前错误地所做的那样 - 您将 Z 包含在本地值的末尾),从而混淆了事情
  • 作为没有指定时区的一般"本地"日期/时间,例如"无论我身在何处,早上 8 点起床"
  • 作为特定时区的日期/时间

(有关每种类型的格式的详细信息,请参阅 RFC 2445。

目前尚不清楚您想要其中的哪一个 - 第一个可能是最简单的,但您需要使用 UTC 日期/时间,而不是本地日期/时间。

一点:.NET 在这里并没有真正帮助您,因为它将事情与DateTime混淆。您可能希望考虑使用我的Noda Time项目,该项目将"本地日期/时间"和"特定区域中的日期/时间"分开。