Как отображать локализованную информацию о дате и времени для веб-пользователей с ASP.NET - PullRequest
8 голосов
/ 03 января 2012

У меня есть приложение 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 или в виде данных обратной передачи, но что если нам нужно отобразить даты на самой первой странице приложения?Можно утверждать, что первая страница всегда является страницей входа, но это не так, когда информация о входе пользователя сохраняется между сеансами (опция «запомнить меня»).Решением этой проблемы может быть сохранение смещения часового пояса как части профиля пользователя, но тогда оно может легко устареть (переходить на летнее время и переходить между сессиями).

Существует ли комплексное решение этой проблемычто хорошо работает и не требует написания тонны кода?Мне очень любопытно, пожалуйста, сообщите.

1 Ответ

5 голосов
/ 03 января 2012

Вы должны передать строку времени клиенту в стандартной форме, такой как ISO8601:

var timeString = '2012-01-02T16:00:00Z';

Некоторые браузеры будут правильно анализировать строки ISO8601, а некоторые - нет, поэтому убедитесь, что они анализируются вручную. Это довольно просто: создайте локальный объект даты, затем установите дату и время в формате UTC:

function localDateFromUTC(s) {

  var x = s.split(/[-\s:tz]/i);
  var d = new Date();

  d.setUTCFullYear(x[0], x[1], x[2]);
  d.setUTCHours(x[3], x[4], x[5]);
  return d;
}

var s = '2012-01-02T16:00:00Z';
var d = localDateFromUTC(s);
alert(d); // Shows local date and time for the provided UTC date and time

Если вы хотите определенный вывод, вам нужно отформатировать его вручную, например,

function formatDate(d) {
  var days = ['Sunday','Monday','Tuesday','Wednesday',
              'Thursday','Friday','Saturday'];
  var months = ['January','February','March','April','May','June','July',
                'August','September','October','November','December'];

  return days[d.getDay()] + ', ' + d.getDate() + ' ' + 
              months[d.getMonth()] + ', ' + d.getFullYear();
} 

Вы можете попробовать использовать toLocaleString () , но результаты сильно различаются в разных браузерах, большинство, похоже, игнорируют локальные настройки.

...