Как преобразовать локализованную дату в стандартную дату в JavaScript? - PullRequest
3 голосов
/ 24 августа 2011

Я пишу кусок кода JavaScript, чтобы отсортировать таблицу данных, которая содержит дату (содержит локализованные даты) и другие поля.Например:

"lunes, 29 de agosto de 2011", "field1", "field2"
"lunes, 28 de agosto de 2011", "field1", "field2"...

при сортировке по дате, мне нужно сравнить даты, преобразовав их в стандартные объекты даты Javascript.Есть ли способ конвертировать локализованную дату в стандартную дату?

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Лучшей библиотекой для этой цели, вероятно, будет Глобализация .Он позволяет вам указать локаль (она называется культурой, но на самом деле она та же самая), формат (встроенный или ваш) и фактический анализ строки на заданную дату:

var dateString = "lunes, 29 de agosto de 2011";
// seems like long date format in Spanish
var date = Globalize.parseDate( dateString, "D", "es" );

Вам потребуетсяприложить соответствующий файл культуры, а также ссылку на Globalize, чтобы он работал.Обратите внимание, что в библиотеке уже определены культуры, поэтому не бойтесь сообщения на веб-странице, вам на самом деле не нужно .Net.

0 голосов
/ 24 августа 2011

Я бы сделал обратное отображение названий месяцев, специфичных для локали, в число (и, вероятно, названия дней) и список распространенных форматов даты. Затем вы можете проверить каждую строку в соответствии с этими форматами и, при сопоставлении, проанализировать значения (например, с помощью регулярного выражения) и построить дату JavaScript с использованием извлеченных данных.

Вот некоторый псевдокод, демонстрирующий идею (только для иллюстрации, не предназначенный для работы):

var i18nDate = {
  'es': {
    'days': ['lunes', 'martes', 'miercoles', ...],
    'months': ['enero', 'febrero', 'marzo', ...],
  },
  // ... for each locale.
};

var i18nFormat = {
  'es': [
    new RegExp( // Format 1, e.g. "lunes, 29 de agosto de 2011"
      '(' + i18nDate.es.days.join('|') + ')' + ', de (\d+) '
      + '(' + i18nDate.es.months.join('|') + ')' + ' de (\d+)'),
    // ... for each common date format.
  ],
  // ... for each locale.
};

function parseI18nDate(s) {
  var locale, formats, i, m;
  for (locale in i18nFormat) {
    formats = i18nFormat[locale];
    for (i=0; i<formats.length; i++) {
      if (m = s.match(formats[i])) {
        return new Date(m[x], m[y], m[z]);
        // TODO: mapping of field position to date component.
      }
    }
  }
  return null;
}

Очевидно, что нужно проработать много деталей, включая конкретные форматы и значения. Усилие достаточно велико, чтобы гарантировать полноценную библиотеку. Возможно, уже есть проект с открытым исходным кодом, чтобы сделать такую ​​вещь?

0 голосов
/ 24 августа 2011

Вам нужно будет преобразовать ваши входные данные в числовой формат dd, mm, yyyy, а затем передать их конструктору Date. Обратите внимание, что мм является нулевым относительным.

В вашем конкретном примере regExp из / (/ d {1,2}) de ([az] +) de (/ d {4}) / предоставит день и год в виде чисел, учитывая массив названия месяцев, indexOf предоставит номер месяца.

Каждому языку потребуется определенная таблица месяцев и / или рег.

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