2012-04-17 72 views
0

我正在使用C#代码来生成.ics文件以将我的事件添加到outlook calander。根据.Ical文件的时区设置开始时间和结束时间?

.ics文件正在使用以下代码生成。 但我这里的问题是根据时区设置开始/结束时间。对于考试我有新加坡标准时间开始/结束时间.ics文件。我希望如果有人在新加坡开档,那么它应该显示新加坡时间,如果有人在印度开门,那么它应该显示印度时间。像2012-04-20 13:00这段时间在印度将是10:30 am所以.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"); 

回答

2

我不希望股权上的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。)

这不是清楚你想要哪些 - 第一个可能是最简单的,但是你需要使用日期/时间,而不是本地的日期/时间。

有一点:.NET并没有真正帮助你在这里,通过与DateTime混淆的东西。您不妨考虑使用我的Noda Time项目,该项目将“当地日期/时间”和“特定区域中的日期/时间”分开。

相关问题