2012-04-17 91 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項目,該項目將「當地日期/時間」和「特定區域中的日期/時間」分開。

相關問題