2012-04-04 3 views
8

Есть ли общий TimeZoneInfo для Центральной Европы, который учитывает как CET, так и CEST в одном?Существует ли общий TimeZoneInfo для Центральной Европы?

У меня есть приложение, которое делает следующее:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); 
DateTimeOffset dto = new DateTimeOffset(someDate, tzi.BaseUtcOffset); 
var utcDate = dto.ToUniversalTime().DateTime; 

Проблема заключается в том, что это возвращает неправильный utcDate, потому что BaseUtcOffset +1 вместо +2. Похоже, что CET также имеет DST, и в зависимости от времени года это +1 или +2.

ответ

5

Во-первых, я хотел бы приветствовать ответ mgnoonan в использования Нода времени :) Но если вы чувствуете себя менее авантюрным ...

Вы уже используете правильный часовой пояс, - но вы не должны использовать BaseUtcOffset который документально не быть о DST:

Возвращает разницу во времени между стандартным временем текущего часового пояса и всемирного координированного времени (UTC).

Он не может принять во внимание DST, когда вы не предоставляя ему DateTime принести смещение для :)

Предполагая someDate является DateTime, вы можете использовать:

DateTimeOffset dto = new DateTimeOffset(someDate, tzi.GetUtcOffset(someDate)); 

Или просто ConvertTimeToUtc:

var utcDate = TimeZoneInfo.ConvertTimeToUtc(someDate, tzi); 

Примечание что вы должны решить, что хотите, если ваше местное время происходит дважды из-за перехода на летнее время или вообще не происходит.

+0

Я знал, что должен был просто подождать, пока вы ответите. ;) – mgnoonan

+0

Отличное объяснение. Хотя Noda Time может быть правильным инструментом, это сработало и является лучшим решением для текущего проекта. –

+0

Небольшой комментарий: ConvertTimeToUtc теперь является статическим методом, поэтому вам нужно позвонить var utcDate = TimeZoneInfo.ConvertTimeToUtc (someDate, tzi) – Eoin

4

Может быть Noda Time может вам помочь?

+0

Определенно, учитывая время Noda, я буду использовать даты. Благодаря! –

Смежные вопросы