我正在开展一个项目,我必须处理很多日期和时间。服务器端技术是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
)转换为区域设置日期和时间,无论使用哪个浏览器客户端。
答案 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的“当前文化对象”(在服务器上)的说明。确保设置正确。