Окружающая среда:
- Веб-формы 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;
Обратите внимание, что вы не можете точно преобразовать часовой пояс при использовании
DateTime
. Итак, начнем с того, что у вас неправильный тип, и эта ошибка, вероятно, проникает во все слои.Что мне делать тогда?
Начните с использования правильных типов в базе данных (
datetimeoffset
), но одного этого недостаточно.@AluanHaddad "... вы не можете точно преобразовать часовые пояса..." - я думаю, вы думаете о экономии дневного света. Кроме того, OP спрашивает только о преобразовании из UTC в местное время, и этого
DataTime
более чем достаточно. "Единственная степень "осведомленности о часовом поясе", которую он имеет, - это сохранение смещения UTC для определенного момента времени. Он не имеет других сведений о часовых поясах, включая часовой пояс, из которого было создано значение, так что его единственное реальное использование - с историческими данными"@MickyD обычно локальное время даты и времени является локальным сервером, что, во всяком случае, для веб-приложений, вероятно, нежелательно.
Вот почему я сказал, что это не достаточно просто необходимо. Вам также необходимо сохранить представление часового пояса.
Я мало что знаю о веб-формах, но если вы визуализируете страницу на стороне веб-сервера, обязательно введите время, преобразованное для пользователя. В противном случае преобразуйте его на стороне клиента в браузере в соответствии с локальной машиной.
"Также нужно хранить представление часового пояса" - бред. Windows Win32 API конвертировали из UTC в местное время и обратно задолго до того, как у нас появился Интернет без необходимости смещения времени UTC и их полусырые попытки обратиться к чрезмерно сложному миру общих смещений UTC и летнего времени.
Зависит от того, где/что вам нужно по местному времени для. Обычно мне нравится работать с наиболее независимыми от культуры и «информационными» данными как можно дольше. Так, например, в веб-приложении преобразуйте ввод на стороне клиента и отправляйте только данные UTC на сервер. А также только отправлять данные UTC с сервера обратно и позволять стороне клиента обрабатывать локализацию просто перед ее отображением.
Все сохраненные значения для исторических данных должны быть в формате UTC. Преобразуйте их для отображения и ввода. Неважно, делается ли это на JavaScript в графическом интерфейсе или в ASP.Net, при условии, что он правильно хранится в базе данных. Добавлено: для серверов вы обычно должны установить часовой пояс сервера на UTC, чтобы а) избежать проблем с переходом на летнее время и б) уменьшить случайное использование местного времени и в) постоянно напоминать вам, что вы всегда должны конвертировать время.