2011-08-22 11 views
5

Próbuję przekonwertować ciąg na obiekt Datetime bez modyfikowania go i dodawania dodatkowej godziny/przesunięcia do obiektu Datetime.Ignorowanie czasu letni (DST) w .NET

Jest to kod:

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS 

DateTime date = Convert.ToDateTime(dateStr); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("date toString: " + date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK")); 

Wyjście:

Original string: 2011-03-18T12:07:00.000+10:00 
date toString: 2011-03-18T13:07:00.000+11:00 

Jeśli ktoś może wskazać w jaki sposób można zignorować DST lub po prostu nawet przekonwertować datę z powrotem do tego, co chcę jako obiekt Datetime, który byłby bardzo doceniany.

Schodząc ścieżką modyfikacji datetime: Próbowałem przekonwertować DateTime z powrotem, ale nie mogę dowiedzieć się, jak zmienić strefę czasową w obiekcie Datetime i kiedy użyć obiektu datetimeoffset do tej pracy, kiedy wezwać DatetimeOffset.Datetime zwraca DateTime bez offsetu

+0

Jakiej wersji .NET używasz? –

+0

To jest w .NET 3.5. Czy istnieje adres URL do Noda Time Jona Skeeta? – Eiji

+0

@Eji, http://code.google.com/p/noda-time/ – Amy

Odpowiedz

0

klasy TimezoneInfo w ramach .NET może dostarczyć odpowiedzi (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx)

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS 

DateTime localDateTime = DateTime.Parse(date); 

DateTime utcDateTime = localDateTime.ToUniversalTime(); 
string estKey = "Eastern Standard Time"; 
TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById(estKey); 
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, estTimeZone); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("date toString: " + estDateTime); 
+0

Doceń pomoc, ale niestety tracimy przesunięcie w ** estDatetime ** tą metodą. – Eiji

3

A Obiekt DateTime nie zawiera strefy czasowej. Zawiera tylko Kind, który może być Utc, Local lub Unspecified.

Podczas wywoływania Convert.ToDateTime jeśli każdy występuje przesunięcie, to przesunięcie zostanie zastosowany, a następnie wartość zostanie przekształcony w strefie czasowej lokalny. To znaczy - strefa czasowa, w której działa kod.

Następnie, korzystając z formatu K, zwraca offset lokalnej strefy czasowej dla konkretnej daty.

Aby obsługiwać ten scenariusz poprawnie, użyć typu DateTimeOffset:

string dateStr = "2011-03-18T12:07:00.000+10:00"; 

DateTimeOffset dto = DateTimeOffset.Parse(dateStr); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("dto toString: " + dto.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK")); 

chodzi wyciągu:

kiedy wezwać DatetimeOffset.Datetime zwraca DateTime bez offsetu

To prawda. Tylko typ DateTimeOffset ma offset do zwrócenia. Obiekt DateTime może tylko zwrócić lokalną lokalną zmianę maszyny lub zero dla DateTime z DateTimeKind.Utc.

-1

DateTime dt = DateTime.Now.ToUniversalTime() + TimeZoneInfo.Local.BaseUtcOffset;

+0

To poprawnie stosuje daną strefę czasową podczas * ignorowania * DST, jak pierwotnie żądano. – Timo

Powiązane problemy