2011-04-04 63 views
1

我有一個頁面可生成vCal和iCal文件,以將事件導入到Outlook和iCal中。這些郵件客戶端(Outlook & iCal)將採用UTC的日期,因爲他們知道用戶的偏移量並將處理正確的時間。我們正在編寫此代碼的客戶端基於美國東部時區,我也是如此。他們的主機位於中部時區(距東部1小時)。我想讓代碼處理這個沒有任何硬編碼的偏移量。我的代碼目前從我們的CMS獲取DateTime,並轉換爲UTC/Outlook。這意味着從CMS DateTime值是相對於主機的位置:將日期時間偏移量應用於美國東部時區

// Start Date Time 
sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ")); 

當我在我的本地運行此,這一切都很好,因爲在CMS的日期時間是基於我們客戶的東部時區等是我,所以這個過程是東方 - > UTC - >進入Outlook,然後去UTC - >東部,一切都很好。當我部署到Central的服務器時,CMS的DateTime距離東部一小時。我如何自動從東部獲得偏移量並在轉換爲UTC之前添加它?我顯然需要這個來處理標準時間(EST)和日光時間(EDT)。我希望以編程方式進行編程,而不使用硬編碼值,因此無論您處於什麼時區,它都能正常工作。如果我將此代碼交付給某個人在印度進行開發,它應該自動處理其本地服務器的偏移並相應地進行調整。

我需要轉換爲UTC之前做這樣的事情,我應用偏移東部時間:

sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ApplyEasternOffset().ToUniversalTime().ToString("yyyyMMddTHHmmssZ")); 

很抱歉,如果這是一個已經討論過的話題,我只是不知道的最好的條件來找到這樣的問題。提前致謝。

+0

此問題開始於服務器產生本地時間戳而不是UTC。這將是很長一段時間你的屁股疼痛,不得不猜測服務器的位置,直到你解決這個問題。 – 2011-04-04 16:14:38

回答

5

檢查出的TimeZoneInfo類。它具有獲取任何時區UTC抵消的方法。

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

此外,檢查出此之前的帖子:How to use TimeZoneInfo to get local time during Daylight Savings Time?

這裏是展示從Pacfic到東部一個轉換的例子:

var eastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
var local = TimeZoneInfo.Local; // PDT for me 
Console.WriteLine(DateTime.Now.Add(eastern.BaseUtcOffset - local.BaseUtcOffset)); 

顯示2011年4月4日12:05: 31當我的本地時鐘顯示9點05分31秒。

+0

這幫助我解決了這個問題。事實證明,我需要添加東部偏移AFTER轉換爲UTC,因爲'ToUniversalTime()'方法已經從本地TZ處理它。所以我改變它:'TimeSpan easternOffset = TimeZoneInfo.Local.BaseUtcOffset - easternTZ.BaseUtcOffset;''和'thisEvent.StartDate.ToUniversalTime()。Add(easternOffset)' – 2011-04-04 17:00:06

5

您可以使用TimeZoneInfo類。

看看這個例子:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"); 
TimeSpan offset = tzi.GetUtcOffset(DateTime.Now); 

DateTime testDateTime = DateTime.Now.Add(offset); 
相關問題