我工作的一个项目,我必须处理大量的日期和时间。 服务器端技术是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
)区域设置日期和时间,无论哪个浏览器客户端使用。
最简洁的答案是不。 可以的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)");
而不是使用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”是默认的日期格式。 这是当你只需拨打你会得到什么样DateTime
的ToString()
方法不带参数(这将意味着CultureInfo.CurrentCulture
作为唯一的参数......)。 默认格式是最好的,这将是长或短,或任何其他的,但最常见的通过这种文化的人使用。
我说toLocaleString()
是错误的,所有的网络浏览器。 这是为什么? 这是因为它会使用Web浏览器的设置,而不是服务器端检测文化。 这意味着,你可以在同一个网页上混合培养物。 如果你的一些日期的格式在服务器端和其他一些在客户端上,可能会发生。 这就是为什么我们需要从服务器端传递(检测)文化。
BTW。 如果您决定包括区域Preferences对话框到Web应用程序,不匹配会更加明显,为toLocaleString()
将不会跟随用户设置...
到时转换为特定的语言环境字符串在服务器上,你可以使用的方法DateTime.ToLongDateString 。 在该页面中,看到有关类的“当前文化对象”(在服务器上)的说明的DateTimeFormatInfo 。 确保我们设置正确。
这个问题的根源是不被任何答案解决。 该任择议定书表示:
我从服务器接收的东西数据时间这样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 ,但也有其他人。