我正在编写一段javascript代码来对包含日期(包含本地化日期)和其他字段的数据表进行排序。例如:
"lunes, 29 de agosto de 2011", "field1", "field2"
"lunes, 28 de agosto de 2011", "field1", "field2"...
按日期排序时,我需要通过将日期转换为标准Javascript日期对象来比较日期。有没有办法将本地化日期转换为标准日期?
答案 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;
}
显然有很多细节需要解决,包括特定于语言环境的格式和值。这项工作足以保证一个完整的图书馆。也许已经有一个开源项目来做这样的事情了?