toLocaleString()在不同浏览器中的行为不一致

时间:2012-11-17 07:32:11

标签: javascript jquery datetime multiple-browsers

我正在开展一个项目,我必须处理很多日期和时间。服务器端技术是ASP.Net,在客户端我使用的是jQuery和jQuery Week Calendar(一个jQuery插件)。

所以这里描述的问题是,我从GMT格式的服务器接收数据时间类似2012-11-13T04:45:00.00

现在在客户端,我希望将此日期时间转换为区域设置日期时间格式,就像IST,EST,PKT等一样。

为实现这一目标,我使用的是JavaScript方法toLocaleString()。这仅适用于Chrome,在其他浏览器中工作不一致。

以下是不同浏览器的输出:

谷歌浏览器(正常工作):

呼叫:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

输出:

Tue Nov 13 2012 10:15:00 GMT+0530 (India Standard Time)

Mozilla Firefox:

呼叫:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

输出:

Tuesday, November 13, 2012 4:45:00 AM

Safari浏览器:

呼叫:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

输出:

Invalid Date

Internet Explorer:

呼叫:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

输出:

Tuesday, November 13, 2012 4:45:00 AM

现在这些是我测试过的浏览器。

以下是问题

我需要一种方法将数据时间(格式如此2012-11-13T04:45:00.00)转换为区域设置日期和时间,无论使用哪个浏览器客户端。

3 个答案:

答案 0 :(得分:12)

简短的回答是否定的。然而,开发人员希望实现toLocaleString。您的问题意味着Chrome会输出您想要的字符串

如果您想要始终如一地输出该格式,则需要使用单独的库 - 例如DateJS

要使用DateJS执行此操作,需要在core.js中提供一些标准格式说明符,以及一些仅在extras.js中可用的格式说明符。该文档有一个all the format specifiers列表。

您想要的字符串是:

Tue Nov 13 2012 10:15:00 GMT+0530 (India Standard Time)

所以要从DateJS得到这个,你需要:

"D M d Y H:i:s \G\M\TO (e)"

DateJS的语法是:

new Date ("2012-11-13T04:45:00.00").format("D M d Y H:i:s \G\M\TO (e)");

答案 1 :(得分:5)

我强烈建议您使用Globalize作为日期和版本,而不是使用过时且错误实施的toLocaleString() 适用于所有网络浏览器 。时间格式化。

然后要在客户端格式化日期,您所要做的就是分配有效的文化并简单地调用格式函数:

Globalize.culture(theCulture);
Globalize.format( new Date(2012, 1, 20), 'd' ); // short date format
Globalize.format( new Date(2012, 1, 20), 'D' ); // long date format

很简单,不是吗?好吧,你还必须将它与你的ASP.Net应用程序集成,这会使事情变得复杂。首先,您需要以常规方式引用globalize.js:

<script type="text/javascript" src="path_to/globalize.js"></script>

然后最好包含正确的文化定义,即格式化时需要使用的定义:

<script type="text/javscript" src="path_to/cultures/globalize.culture.<% = CultureInfo.CurrentCulture.ToString() %>.js"></script>

最后,您需要在使用之前设置theCulture变量:

<script type="text/javscript">
    var theCulture = <% = CultureInfo.CurrentCulture.ToString() %>
</script>

当然,更优雅的方法是在代码隐藏中创建一个属性或方法,为您写下相应的脚本,然后引用该方法,比如说:

public string IntegrateGlobalize(string pathToLibrary)
{
  var sb = new StringBuilder();
  sb.Append("<script type=\"text/javascript\" src=\"");
  sb.Append(pathToLibrary);
  sb.AppendLine("/globalize.js\"></script>");
  sb.Append("<script type=\"text/javascript\" src=\"");
  sb.Append(pathToLibrary);
  sb.AppendLine("/cultures/globalize.culture.");
  sb.Append(CultureInfo.CurrentCulture);
  sb.AppendLine(\"></script>");
  sb.Append("<script type=\"text/javascript\">");
  sb.Append("var theCulture = ");
  sb.Append(CultureInfo.CurrentCulture);
  sb.AppendLine(";</script>");

  return sb.ToString();
}

然后你要做的就是在(master?)页面头部引用这个方法:

<head>
  <% = IntegrateGlobalize("path_to_globalize") %>
  ...
</head>

一些问题

如果你想100%正确地完成它,你需要增强Globalize文化生成器以包含'g'格式开关,然后在客户端使用这个确切的开关来格式化日期:

Globalize.format( new Date(2012, 1, 20), 'g' ); // default date format

为什么?因为'g'是默认的日期格式。只需在没有参数的情况下调用DateTime的{​​{1}}方法(这将暗示ToString()作为唯一参数...),您就可以获得这一点。默认格式最好是短或长,或任何其他格式,但是使用此文化的人最常使用。

我说CultureInfo.CurrentCulture对所有网络浏览器都是错误的。这是为什么?那是因为它将使用Web浏览器设置而不是服务器端检测到的文化。这意味着,您可能在同一网页中混合了文化。如果您的某些日期在服务器端格式化,而另一些日期在客户端格式化,则可能会发生这种情况。这就是我们需要从服务器端传递(检测到)文化的原因 BTW。如果您决定将区域偏好设置对话框包含在您的网络应用程序中,则不匹配会更加明显,因为toLocaleString()不会跟随用户设置......

答案 2 :(得分:2)

要将时间转换为服务器上特定于语言环境的字符串,可以使用方法DateTime.ToLongDateString。在该页面上,请参阅有关类DateTimeFormatInfo的“当前文化对象”(在服务器上)的说明。确保设置正确。