如何在JavaScript中将本地化日期转换为标准日期?

时间:2011-08-24 12:33:17

标签: javascript date localization

我正在编写一段javascript代码来对包含日期(包含本地化日期)和其他字段的数据表进行排序。例如:

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

按日期排序时,我需要通过将日期转换为标准Javascript日期对象来比较日期。有没有办法将本地化日期转换为标准日期?

3 个答案:

答案 0 :(得分:3)

为此目的的最佳图书馆可能是Globalize。它允许您指定语言环境(它被称为culture,但它实际上是相同的),格式(内置或您自己的)并实际解析给定日期的字符串:

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

您需要附加适当的文化文件以及对Globalize的引用才能使其正常工作。请注意文化已经在图书馆中定义,所以不要害怕网页上的消息,实际上不需要 .Net。

答案 1 :(得分:0)

您需要将输入数据转换为dd,mm,yyyy数字格式,然后将其提供给Date构造函数。请注意,mm相对为零。

在您的具体示例中,/(/ d {1,2})de([az] +)de(/ d {4})/的regExp将提供日期和年份作为数字,给定一个数组月份名称,indexOf将提供月份编号。

每种语言都需要一个特定的月份表和/或reg exp。

答案 2 :(得分:0)

我会将特定于语言环境的月份名称反向映射到数字(也可能是日期名称)和常用日期格式列表。然后,您可以根据这些格式检查每个字符串,并在匹配时解析值(例如使用正则表达式)并使用提取的数据构造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;
}

显然有很多细节需要解决,包括特定于语言环境的格式和值。这项工作足以保证一个完整的图书馆。也许已经有一个开源项目来做这样的事情了?