日历日期的全球化问题

时间:2012-09-14 11:00:41

标签: javascript globalization jquery-globalization

如何处理不同文化的日期,即如何使用常用的javascript代码来处理所有文化的日期。 例如 -

Globalize.culture( "en" );
Globalize.parseDate( "1/2/2003" ); // Thu Jan 02 2003
Globalize.culture( "fr" );
Globalize.parseDate( "1/2/2003" ); // Sat Feb 01 2003

在上面的代码中,我如何制作通用代码,而不是更改不同文化的日期格式。

提前致谢

3 个答案:

答案 0 :(得分:1)

你做不到。所有文化都没有日期符号。 1/2/2003的例子特别具有说明性:你不知道它的含义,除非你有关于制作它的人所使用的文化习俗的可靠信息。事实上,您需要区分en-US(美国英语)和en-GB(英国英语)。

Globalize.js库旨在处理这种变化,而不是删除它。

It is possible to allow different date notations e.g. as follows (code excerpt from my book [Going Global with JavaScript and Globalize.js][1]):
function read(dateInput) { 
  var languages = ['en', 'fi', 'sv', 'ru']; 
  var formats = ['d', 'D']; 
  var date; 
  for(var langNr in languages) { 
    for(var fmtNr in formats) { 
      date = Globalize.parseDate(dateInput,formats[fmtNr],languages[langNr]); 
      if(date != null) { 
        return date; 
      } 
    } 
  } 
  return null; 
}

这将允许(美国)英语,芬兰语,瑞典语和俄语中使用的短日期和长日期符号,因此它将相当自由,适合用户需要使用其中一种语言的情况。

但是您添加的区域设置越多,出现的歧义就越多。如果在不同的语言环境中允许使用1/2/2003这样的符号但它们有多种含义,那么你的循环结构将定义应用的含义。这反过来可能意味着输入的意义不同于用户的意图。出于这个原因,最好避免使用全数字日期表示法。需要月份名称的格式更加安全。

2003-02-01等格式在原则上是明确的,但仅在原则上,对大多数人来说看起来不自然。但是,您可以在Globalize.js中阅读此类格式;你只需要明确指定格式。

答案 1 :(得分:0)

你的意思是国际化。 ISO8601等标准规定了明确的格式,例如2012年2月1日的2012-02-01。

我认为日期格式与“文化”无关,更多的是与国籍有关。世界上绝大多数英语使用者使用日/月/年的格式,这与他们所居住的国家有关,而不是他们可能遵循或支持的任何文化。

还有其他明确的格式,例如始终使用月份名称而不是数字,例如2012年2月1日或2012年2月1日。对于Gregorian以外的日历同样适用。

答案 2 :(得分:0)

说实话,你的问题不是很清楚。从上下文中,我推断您希望让用户以其原生格式输入日期,并使用Globalize以某种方式自动“检测”格式将是什么并应用适当的解析方法。

如果这就是你所追求的,那就无法做到。您已经了解各个国家/地区的格式差异。更糟糕的是,可能会使用长格式或短格式(不幸的是,Globalize不支持.Net中通过调用DateTime的ToString("g"))提供的默认格式的概念。这意味着,您可能拥有“2012-10-31”,“31.10.12”和“31października2012”等所有(或多或少)有效的波兰日期格式。

我希望你现在意识到允许自由输入不是一个好主意。那又怎么办呢?答案是使用jQuery UI's Datepicker。这可能相当容易本地化,您所要做的就是添加有效的区域脚本:

$( "#datepicker" ).datepicker( $.datepicker.regional[ "fr" ] );

然后,要获取JavaScript的Date对象,请调用Datepicker的getDate()方法:

var currentDate = $( ".selector" ).datepicker( "getDate" );

就是这样。 BTW。 Datepicker允许转换最终用户输入的日期(如果将其附加到文本字段)。但当然它将是区域脚本指定的格式......