Проверьте, включен ли DST по времени UTC в sql
Я работаю в проекте MVC4, где я сталкиваюсь с проблемой со временем. На самом деле, мое требование к проекту - показать все время, использованное в приложении, согласно бразильскому времени. Так что я использовал GETUTCDATE()
для экономии времени в приложении.
Теперь я хочу проверить, включено ли DST в соответствии со временем, которое я сохранил. Я имею в виду центральное время. Как мне это проверить. У меня есть поиск в сети и нашел одно решение
DECLARE @IsDST BIT;
SET @IsDST = CASE WHEN DateDiff(hour, GetDate(), GetUTCDate()) = 4 THEN 'True'
ELSE 'False' END;
SELECT GETDATE() AS GETDATE,
GETUTCDATE() AS GETUTCDATE,
@IsDST;
Но когда я пытаюсь запустить этот скрипт, он возвращает false??
Но согласно расчету DST, он всегда начинается со второго воскресенья марта и заканчивается в первое воскресенье ноября.
Тогда он должен вернуть true, что DST включен.
Правильно ли я поступаю или есть другой лучший способ проверить, находится ли летнее время по центральному времени, чтобы я мог показать бразильское время согласно летнему времени?
1 ответ
Ну, этот конкретный код не работает для обнаружения DST в Бразилии, потому что он просто измеряет разницу между местным временем и UTC, проверяя разницу в 4 часа или нет.
Большая часть Бразилии на 3 часа отстает от UTC в стандартное время и на 2 часа отстает от UTC в дневное время. Так что этот код, вероятно, не будет работать для вас. Вы можете прочитать больше в этой статье Википедии.
Летнее время во всем мире сильно отличается, поэтому, если вы собираетесь использовать этот подход, вам придется изменить код, чтобы он соответствовал часовому поясу сервера, на котором он работает.
Лично я бы рекомендовал вообще не делать этого в SQL. Преобразования часовых поясов на самом деле не являются областью базы данных. Они работают намного лучше в коде приложения. Вы должны работать с UTC в своей базе данных и преобразовать его в Бразилию или любой другой часовой пояс, который вам требуется в вашем приложении.
Поскольку вы сказали, что это приложение ASP.Net MVC4, я рекомендую вам использовать.net TimeZoneInfo
или используйте отличную библиотеку Noda Time для преобразования в ваш.Net код.
С помощью TimeZoneInfo
:
DateTime utcDT = // ... your UTC value returned from the database
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(
"E. South America Standard Time"); // Brazil
DateTime brazilDT = TimeZoneInfo.ConvertTimeFromUtc(utcDT, tz);
Использование Noda Time:
DateTime utcDT = // ... your UTC value returned from the database
Instant instant = Instant.FromDateTimeUtc(utcDT);
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Sao_Paulo"]; // Brazil
ZonedDateTime brazilZDT = instant.InZone(tz);
DateTime brazilDT = brazilZDT.ToDateTimeUnspecified();