У меня есть приложение ASP.NET и отметка времени UTC на сервере.Я хочу отобразить метку времени для пользователя в правильном часовом поясе, и использование локального формата даты / времени .
Например, Jan 2, 2012 14:00:00 UTC
должно отображаться как 1/2/2012 9:00 AM
для пользователя в Новом.Йорк, США (UTC-0500) и как 02/01/2012 14:00
для пользователя в Лондоне, Великобритания.
Эта, казалось бы, простая задача оказалась на удивление трудной. В MSDN есть статья с тем же названием, но в ней говорится о разборе пользовательского ввода, а не об отображении данных на стороне сервера, поэтому он применяется не полностью.
Смещение часового пояса легко определитьклиент через JavaScript
offset = new Date().getTimezoneOffset();
,
, но JavaScript очень плохо поддерживает форматирование даты / времени.Все, что вы получаете, это метод toLocaleString()
, который приводит к ужасной длинной строке, такой как Monday, January 02, 2012 9:00:00 AM
.Нет более коротких форматов, поэтому на клиенте мы застряли с хорошей информацией о часовом поясе и плохими возможностями формата даты / времени.
Ситуация на сервере совершенно противоположная.Мы можем использовать HTTP-заголовок Accept-Language, чтобы получить языковой стандарт пользователя ( не лучший выбор, но может быть достаточно хорошим ), а затем подключиться к базе данных .NET известных языковых стандартов, чтобы наш код шел построки
CultureInfo userCulture = new CultureInfo(Request.UserLanguages[0]);
плюс некоторая обработка ошибок.
Но тогда мы застряли на проблеме часового пояса.Да, его можно получить с помощью JavaScript, а затем передать обратно в виде файла cookie или в виде данных обратной передачи, но что если нам нужно отобразить даты на самой первой странице приложения?Можно утверждать, что первая страница всегда является страницей входа, но это не так, когда информация о входе пользователя сохраняется между сеансами (опция «запомнить меня»).Решением этой проблемы может быть сохранение смещения часового пояса как части профиля пользователя, но тогда оно может легко устареть (переходить на летнее время и переходить между сессиями).
Существует ли комплексное решение этой проблемычто хорошо работает и не требует написания тонны кода?Мне очень любопытно, пожалуйста, сообщите.