Проблема с преобразованием даты по Гринвичу в местное время с помощью С#?

У нас есть приложение для Windows Mobile, написанное на C# (compact framework). Региональные настройки установлены на (английский) Новая Зеландия. Часовой пояс установлен на GMT+12 Новая Зеландия.

Мы храним наши даты в формате GMT/UTC. У нас есть дата 2010-02-18 18:00:00 по UTC

На этот раз в Новой Зеландии 7:00 утра.

Когда мы вызываем объект datetime

starttime = starttime.ToLocalTime();

мы получаем 9:00 утра.
Что мы делаем неправильно?


person Pentium10    schedule 19.02.2010    source источник
comment
Вы убедились, что starttime действительно находится по Гринвичу?   -  person Zach Johnson    schedule 20.02.2010
comment
Если ваш часовой пояс GMT+12, должно ли 18.00 часов привести к 6.00 часам следующего дня? Ни 7.00, ни 9.00 не являются правильным ответом. (в замешательстве...)   -  person Treb    schedule 20.02.2010
comment
@Treb: Думаю, в середине февраля в Новой Зеландии летнее время. Странный...   -  person Remus Rusanu    schedule 20.02.2010
comment
@Treb Я тоже запутался, я не знаю, как правильно преобразовать дату UTC в местное время. Параметр GMT+12 New Zealand доступен в раскрывающемся списке в настройках времени устройства Windows Mobile.   -  person Pentium10    schedule 20.02.2010
comment
@ Зак, я убедился, что это действительно по Гринвичу. Для моего местного часового пояса работает отлично, у нас проблемы с Новой Зеландией.   -  person Pentium10    schedule 20.02.2010
comment
@Pentium 10, @Remus Rusanu: Думаю, Ремус на правильном пути. В северном полушарии у нас зима (действительно, я вижу снег, когда смотрю в окно ;-), но в южном полушарии сейчас лето, так что летнее время или летнее время, скорее всего, являются причиной моей отключения на одну ошибку.   -  person Treb    schedule 20.02.2010


Ответы (1)


Вы указали «вид» на этой дате и времени? Что-то вроде этого:

DateTime parsedStartTime = DateTime.SpecifyKind(
    DateTime.Parse(starttime),
    DateTimeKind.Utc);

DateTime localStartTime = parsedStartTime.DateToLocalTime();

Это может помочь, поскольку он может не знать, что дата и время, которые у вас есть сейчас, имеют тип Utc (вероятно, он не указан).

Если это не поможет, возможно, вам поможет часть вашего кода, показывающая, как вы устанавливаете время запуска.

person Tim C    schedule 19.02.2010
comment
Я добавил DateTimeStyles.AssumeUniversal в наш метод ParseExact и отлично работает. - person Pentium10; 20.02.2010