2009-10-12 6 views
10

Muszę użyć niektórych dat i godzin ze starszej bazy danych. Są one reprezentowane jako łańcuchy. Daty to dd/MM/rr. Czasy to HH: mm.Konwertowanie czasów brytyjskich (zarówno BST, jak i GMT) reprezentowanych jako łańcuchy znaków do UTC (w języku C#)

Chciałbym przekonwertować te do UTC, jak tylko wyciągnę je z bazy danych. Pracuję nad systemami amerykańskimi, więc potrzebuję wspólnego czasu.

Problem, który napotykam, polega na przekonwertowaniu ich na wartości DateTime UTC. Mogę zrobić parsowanie itp. Prawdziwy problem, który mam dotyczy strefy czasowej.

Próbuję użyć następujące podejście:

DateTime ukTime = // Parse the strings in a DateTime value. 
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.BaseUtcOffset); 

to jednak daje niepoprawne wartości, jeżeli data jest w okresie British Summer czasu.

W tych terminach mogę używać "GMT Daylight Time", ale to wymaga ode mnie ustalenia, kiedy nastąpi przełączenie. Jestem pewien, że musi być mniej pracochłonny sposób.

Ponieważ nie używam urządzenia z ustawieniami czasu w Wielkiej Brytanii, nie mogę polegać na czasie lokalnym.

Zasadniczo, muszę coś takiego:

// Works for both GMT (UTC+0) and BST (UTC+1) regardless of the regional settings of the system it runs on. 
DateTime ParseUkTimeAsUtcTime(string date, string time) 
{ 
    ... 
} 

mam prana posty, ale nie mógł znaleźć niczego, co ten adresowany bezpośrednio. Z pewnością jest to również problem z EST, EDT itp.?

+0

Potrzebuję tego jako ogólnej metody TimeInTimeZone-> TimeInUTC. –

Odpowiedz

5

Spróbuj użyć metody GetUtcOffset() w instancji TimeZoneInfo, która uwzględnia "reguły dopasowania".

Używanie tego powinno działać w zasadzie tak samo, jak w oryginalnym przykładzie, ale będziesz używać tej metody zamiast właściwości BaseUtcOffset.

DateTime ukTime = // Parse the strings in a DateTime value. 
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.GetUtcOffset(ukTime)); 
+0

Miło, ale czy mógłbyś wysłać próbkę kodu dla ignorantów? To powinno być zasobem kanonicznym. –

+0

Myślę, że ten przykład powinien obejmować to, co musisz zrobić. Daj mi znać, jeśli w ogóle to uprościłeś. – bdukes

+0

Jedyną rzeczą, którą mogę dodać do tego, jest to, aby uzyskać rzeczywisty obiekt DateTime, o którym mowa "utcTime.UtcDateTime" –

0

Jak o:

DateTime.Parse(dateTimeString).ToUniversalTime(); 

Zakładając, że serwer bazy danych przechowuje swoje datetimes w tej samej strefie czasowej co serwer aplikacji.

Powiązane problemy