2015-04-30 5 views
0

Содержит ли метод TimeZoneInfo.ConvertTimeFromUtc параметры дневного света из реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zone для расчета локального времени?Преобразование времени с TimeZoneInfo за последние годы

Если да, то работает ли оно только текущее время, а не какие-либо прошлые годы или даты? Я хотел бы знать, смогу ли я преобразовать прошедшее время времени в «Восточное стандартное время», например «2-1-2010 3:00 PM» в GMT или UTC, который следует за DLS (Day Light Saving) для год 2010? Например, еще один год, например, «2-1-2006 3:00 PM». Когда вы читаете here, DST изменился в 2007 году для США.

Могу ли я спросить, какое наилучшее решение, если мне нужно отображать время встречи из базы данных SQL в двух разных местных городах, таких как Малайзия и Нью-Йорк (USA Eastern Standard Time) для посетителей за последние 5 лет?

+0

См. [Timezoneinfo.cs] (http://referencesource.microsoft.com/#mscorlib/system/timezoneinfo.cs) –

ответ

1

Метод TimeZoneInfo.ConvertTimeFromUtc прочитал настройки дневного света из реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zone для расчета локального времени?

Да, за исключением того, имя ключа последнее Time Zones (вы сбросили s). Вы можете прочитать о том, как это работает в this MSDN blog article.

Если да, то работает ли оно только на текущее время, а не на прошлые годы или даты?

Он будет работать в течение прошлых лет, которые существуют в данных реестра Windows. Вы можете изучить каждый подраздел в реестре, чтобы узнать, как далеко назад вы можете конвертировать для каждой зоны. Однако в данных имеются различные ошибки и упущения. В общем, историческая точность этих данных не так хороша, как другие источники, такие как база данных часовых поясов IANA/Olson, которую вы можете использовать через Noda Time. Читайте больше в the timezone tag wiki.

Я хотел бы знать, могу ли я преобразовать прошедшее время в «Восточное стандартное время», например, «2-1-2010 3:00 PM» в GMT или UTC, который следует за DLS (Day Light Saving) за 2010 год? Например, еще один год, например, «2-1-2006 3:00 PM». Как вы читаете здесь, DST изменился в 2007 году для США.

  • Термин "летнее время" - нет заглавных букв, одно слово для дневного света, сокращенные DST

  • Да, данные часового пояса для Windows и TimeZoneInfo принимать во внимание DST.

  • Для преобразования в UTC, используйте ConvertTimeToUtc, не ConvertTimeFromUtc.

  • Да, Windows знает о изменении DST 2007 года в США. Это не Однако, знаете о earlier changes, например, значения до Uniform Time Act вступили в силу в 1987 году. Для этого вам нужна база данных IANA/Olson.

Могу ли я спросить, что является лучшим решением, если я должен отображать назначение времени из базы данных SQL в двух разных местных жителей, как Малайзия и Нью-Йорк (США Eastern Standard Time) для посетителей в за последние 5 лет?

  • Использование TimeZoneInfo использовать ID "Eastern Standard Time" ID для Нью-Йорка, и "Singapore Standard Time" ID для Малайзии.

  • Используя временные зоны IANA/Olson с Noda Time, используйте "America/New_York" и "Asia/Kuala_Lumpur".

  • Любой вариант в порядке в течение последних 5 лет, о котором вы просили. Malaysia's last time zone change was in 1982.

  • Прошедшие события, хранимая UTC в вашей базе данных, либо сохраняйте значения DateTimeOffset с учетом правильного времени и смещения для часового пояса события (См. DateTime vs DateTimeOffset). Конвертируйте с UTC в часовой пояс зрителя по мере необходимости для отображения.

  • Для планирования будущих событий храните локальное время события в вашей базе данных и следуйте the guidance I've written here.

Вы также найдете расширенное руководство по этой теме в моем Pluralsight конечно, Date and Time Fundamentals. В частности, вам следует рассмотреть разделы под заголовками «Временные зоны», «Дата и время в .NET Framework» и «Представление времени Noda».

+0

Кроме того, в будущем, пожалуйста, подумайте о том, чтобы задать один вопрос в вопросе StackOverflow, а не четыре вопроса в один. Благодарю. –

1

По моему опыту ConvertTimeFromUtc отлично работает на прошлые даты.

Лучшее решение для diplaying даты в различных локалях:

  • магазин дата как UTC (возможно, придется запустить сценарий для преобразования существующих заходов)
  • использования ConvertTimeFromUtc на соответствующей временной зоне при отображении. (Если он не работает, попробуйте изменить DateTime.DateTimeKind на дату, которая возвращается из БД)

(я не уверен, что США меняются на экономии дневного света, который, как правило, рассчитывается с использованием фиксированной формулы.)

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