Какой слой я должен преобразовать свой часовой пояс в местный?

avatar
Rod
8 апреля 2018 в 04:34
83
0
2

Окружающая среда:

  • Веб-формы ASP.NET
  • 3 уровня
  • .Net 4.6.1
  • SQL Server 2014

У меня есть код для преобразования UTC в мой локальный timezone. Это дело находится в моем data layer. Это правильный слой? Следующий фрагмент — это когда пользователь получает данные. Я не выполняю никаких преобразований, когда пользователь сохраняет данные.

DateTime? dateModified = row.GetValueOrDefault<DateTime>("DateModified");

if (dateModified != DateTime.MinValue) dateModified = 
        TimeZoneInfo.ConvertTime((DateTime)dateModified, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
task.DateModified = dateModified;
Источник
Aluan Haddad
8 апреля 2018 в 04:37
1

Обратите внимание, что вы не можете точно преобразовать часовой пояс при использовании DateTime. Итак, начнем с того, что у вас неправильный тип, и эта ошибка, вероятно, проникает во все слои.

Rod
8 апреля 2018 в 04:38
0

Что мне делать тогда?

Aluan Haddad
8 апреля 2018 в 04:42
1

Начните с использования правильных типов в базе данных (datetimeoffset), но одного этого недостаточно.

MickyD
8 апреля 2018 в 04:57
1

@AluanHaddad "... вы не можете точно преобразовать часовые пояса..." - я думаю, вы думаете о экономии дневного света. Кроме того, OP спрашивает только о преобразовании из UTC в местное время, и этого DataTime более чем достаточно. "Единственная степень "осведомленности о часовом поясе", которую он имеет, - это сохранение смещения UTC для определенного момента времени. Он не имеет других сведений о часовых поясах, включая часовой пояс, из которого было создано значение, так что его единственное реальное использование - с историческими данными"

Aluan Haddad
8 апреля 2018 в 05:00
0

@MickyD обычно локальное время даты и времени является локальным сервером, что, во всяком случае, для веб-приложений, вероятно, нежелательно.

Aluan Haddad
8 апреля 2018 в 05:02
0

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

MickyD
8 апреля 2018 в 05:02
0

Я мало что знаю о веб-формах, но если вы визуализируете страницу на стороне веб-сервера, обязательно введите время, преобразованное для пользователя. В противном случае преобразуйте его на стороне клиента в браузере в соответствии с локальной машиной.

MickyD
8 апреля 2018 в 05:03
0

"Также нужно хранить представление часового пояса" - бред. Windows Win32 API конвертировали из UTC в местное время и обратно задолго до того, как у нас появился Интернет без необходимости смещения времени UTC и их полусырые попытки обратиться к чрезмерно сложному миру общих смещений UTC и летнего времени.

Corak
8 апреля 2018 в 05:04
2

Зависит от того, где/что вам нужно по местному времени для. Обычно мне нравится работать с наиболее независимыми от культуры и «информационными» данными как можно дольше. Так, например, в веб-приложении преобразуйте ввод на стороне клиента и отправляйте только данные UTC на сервер. А также только отправлять данные UTC с сервера обратно и позволять стороне клиента обрабатывать локализацию просто перед ее отображением.

Ben
8 апреля 2018 в 17:07
2

Все сохраненные значения для исторических данных должны быть в формате UTC. Преобразуйте их для отображения и ввода. Неважно, делается ли это на JavaScript в графическом интерфейсе или в ASP.Net, при условии, что он правильно хранится в базе данных. Добавлено: для серверов вы обычно должны установить часовой пояс сервера на UTC, чтобы а) избежать проблем с переходом на летнее время и б) уменьшить случайное использование местного времени и в) постоянно напоминать вам, что вы всегда должны конвертировать время.

Ответы (0)