2012-09-24 46 views
0

我正在嘗試使用需要UTC日期的Web服務。所以,我發現:UTC時間轉換

private static string GetDate(DateTime DateTime) 
{ 
    DateTime UtcDateTime = TimeZoneInfo.ConvertTimeToUtc(DateTime); 
    return XmlConvert.ToString(UtcDateTime, XmlDateTimeSerializationMode.Utc); 
} 

如果我做的:

DateTime DT1 = new DateTime(2012, 3, 25); 
DateTime DT2 = new DateTime(2012, 3, 26); 
string s1 = GetDate(DT1); 
string s2 = GetDate(DT2); 

S1包含:

2012-03-25T00:00:00Z 

和s2包含:

2012-03-25T23:00:00Z 

爲什麼S2不包含:

2012-03-26T00:00:00Z 

?謝謝。

+2

你在哪個時區? (請注意,如果您遵循正常的.NET命名約定並使變量爲camelCased,那麼您的代碼會更容易使用。看到名爲DateTime的變量真的很奇怪。) –

+0

公平 - 該方法剛剛複製。我在(UTC)都柏林,愛丁堡,里斯本,倫敦 - 這是夏季時間的變化嗎? – cs0815

+1

如果你還沒有這樣做,可以看看DateTimeOffset(http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx)。這是用TimeSpan包裹的DateTime(即時區偏移)。 – flindeberg

回答

3

London time zone在3月25日凌晨1點(當地時間)從UTC + 0移至UTC + 1時發生夏令時轉換。因此,3月26日在英國的本地午夜恰好是UTC時間2012-03-25 23:00:00。這幾乎肯定是問題的原因。

你應該算出你真的想要的值是什麼。不幸的是DateTime在清晰度方面幫助你不是很好。你可能想考慮使用我的Noda Time庫 - 或者如果你不這樣做,至少在類似的concepts中記錄你的代碼。 (這聽起來像你想一個LocalDate轉變爲一個Instant,爲了做到這一點,你需要找出哪個時區,你真正的意思。)

這是完全可能的,你可能能以逃避:

DateTime DT1 = new DateTime(2012, 3, 25, 0, 0, 0, DateTimeKind.Utc); 
DateTime DT2 = new DateTime(2012, 3, 26, 0, 0, 0, DateTimeKind.Utc); 
+1

老鼠,打我吧! – verdesmarald

+0

當然這是有道理的。傻我。 – cs0815

+0

也感謝代碼改進建議。 – cs0815