Проблема получить отчет из таймера SQL Server - PullRequest
0 голосов
/ 28 февраля 2019

Один из вопросов, который мы постоянно получаем, заключается в том, как изменить время сервера, чтобы оно соответствовало часовому поясу клиента или пользователей.К сожалению, ответ - вы не можете.Веб-сервер может работать только в одном часовом поясе, поэтому время будет «выключено» в остальных 39 часовых поясах.

Чтобы обойти это, вы можете преобразовать время сервера в местное.время..NET упрощает эту задачу с помощью встроенного класса TimeZoneInfo, который можно использовать для преобразования одного часового пояса в другой.

Тогда мое серверное время будет отличаться от моего местного времени на 12,30 часа, т.е. вычитать 12 часов и 30минут от моего местного времени, чтобы получить мое время сервера.Мне нужно получить местное время от сервера времени.Как это может быть достигнуто?

Я пытаюсь создать класс:

protected DateTime GetCurrentTime()
{
        DateTime serverTime = DateTime.Now;
        DateTime _localTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(serverTime, TimeZoneInfo.Local.Id, "Arab Standard Time");
        return _localTime;
}

И вот как получить TimeZoneId на сервере:

protected void Page_Load(object sender, EventArgs e)
{
       foreach (TimeZoneInfo zoneID in TimeZoneInfo.GetSystemTimeZones())
        {
            Response.Write(zoneID.Id + "<br/>");
        }
}

НоЯ не знаю, что я делаю не так или что хорошего в этом.Все, что у меня есть, - это база данных на сервере, подключенная к приложению c # windows, и я пытаюсь использовать этот код для получения моего сегодняшнего отчета > DATEADD(d, - 1, GETDATE()), но он работает после 11:30

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы не должны писать код, который заботится о часовом поясе сервера.Вместо этого напишите код, который работает с временем UTC и конкретным часовым поясом.

Ваш код C # должен выглядеть следующим образом:

DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Arab Standard Time");

Для SQL, как правило, вы должны записывать на основе UTCзначения, в этом случае не требуется никакого преобразования.Однако, если вам нужно конвертировать, потому что вы храните локальное значение, вы можете использовать текущее время UTC системы и функцию AT TIME ZONE следующим образом:

WHERE dt > (DATEADD(d, -1, GETUTCDATE() AT TIME ZONE 'Arab Standard Time')

В обоих случаяхпредпочтительно идентификатор часового пояса 'Arab Standard Time' исходит из переменной, а не жестко закодирован.

0 голосов
/ 28 февраля 2019

Кажется, существует разница между локальным часовым поясом системы SQL Server и часовым поясом, используемым для отметки времени записанных данных.Я бы посоветовал проверить последние записанные данные и сравнить их с местным временем системы сервера SQL;это должно выявить такую ​​разницу.

Если записанные данные имеют метку времени, например, в UTC, то вы можете получить данные за последние 24 часа для диапазона времени между DATEADD (d, -1, GETUTCDATE).()) и GETUTCDATE ().Обратите внимание, что это не обязательно дает вам отчет от полуночи до полуночи по местному времени;для этого вы должны сначала рассчитать диапазон времени UTC по местному времени от полуночи до полуночи, а затем запросить рассчитанный диапазон времени UTC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...