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

2019-06-21 05:04发布

我工作的一个项目,我必须处理大量的日期和时间。 服务器端技术是ASP.Net和在客户端,我使用jQuery的jQuery和日历周(一个jQuery插件)。

因此,这里的问题描述,我从服务器接收的东西数据时间这样2012-11-13T04:45:00.00 GMT格式。

现在,在客户端,我想这个日期时间转换为区域日期时间格式,像什么是可能是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)

火狐浏览器:

呼叫:

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

输出:

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

苹果浏览器:

呼叫:

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

输出:

Invalid Date

IE浏览器:

呼叫:

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

输出:

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

目前,这种在哪里我测试的浏览器。

这里是问题

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

Answer 1:

最简洁的答案是不。 可以的toLocaleString但是可以实现开发商的愿望。 你的问题暗示的是,Chrome的输出你想要的字符串

如果你想输出格式一致,你需要使用一个单独的库-像DateJS 。

与DateJS为此将需要core.js和一些仅在extras.js可提供一些标准格式说明。 该文件有一个列表的所有格式说明 。

你想要的字符串是:

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)");


Answer 2:

而不是使用toLocaleString()这是过时的和不正确地为所有网络浏览器中实现,我强烈建议使用Globalize的日期和时间格式。

然后格式化客户端上的日期,所有你需要做的就是分配有效的区域性和简单的调用函数格式:

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();
}

然后,所有你需要做的,就是在引用此方法页头(主):

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

有些问题

如果你想100%正确地做到这一点,你需要提升文化全球化时代发电机,包括'g'格式开关,然后使用这个确切的交换机上的客户端格式化日期:

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

这是为什么? 因为“G”是默认的日期格式。 这是当你只需拨打你会得到什么样DateTimeToString()方法不带参数(这将意味着CultureInfo.CurrentCulture作为唯一的参数......)。 默认格式是最好的,这将是长或短,或任何其他的,但最常见的通过这种文化的人使用。

我说toLocaleString()是错误的,所有的网络浏览器。 这是为什么? 这是因为它会使用Web浏览器的设置,而不是服务器端检测文化。 这意味着,你可以在同一个网页上混合培养物。 如果你的一些日期的格式在服务器端和其他一些在客户端上,可能会发生。 这就是为什么我们需要从服务器端传递(检测)文化。
BTW。 如果您决定包括区域Preferences对话框到Web应用程序,不匹配会更加明显,为toLocaleString()将不会跟随用户设置...



Answer 3:

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



Answer 4:

这个问题的根源是不被任何答案解决。 该任择议定书表示:

我从服务器接收的东西数据时间这样2012-11-13T04:45:00.00 GMT格式。

GMT是不是一个格式。 此字符串是在ISO 8601扩展格式,无需指定任何时区。 在ISO 8601规范说,如果没有资格赛,这是为了表示本地时间 。 要指定GMT,你就一个附加Z到底,或者你可以添加一个偏移如+00:00

问题是,ECMAScript中(V1 - V5.1)并没有兑现在规范这一规定。 它实际上是说,应该被解释为UTC,而不是本地时间。 有些浏览器荣获ISO规范,一些兑现ECMA规范。 这已得到纠正版本6,和大多数浏览器都遵守。

所以-如果你打算发送基于UTC / GMT时间戳记,然后在服务器端,你应该总是发送Z所以没有歧义。

不过,即使该正确解释,但也不能保证该字符串将被格式化同跨浏览器。 对于这一点,你确实需要的库。 我建议moment.js ,但也有其他人。



文章来源: Inconsistent behavior of toLocaleString() in different browser