我强烈建议使用Globalize来设置日期和时间格式,而不是使用toLocaleString()
which is outdated 并且未正确实现所有 Web 浏览器。
然后要在客户端格式化日期,您所要做的就是分配有效的文化并简单地调用 format 函数:
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% 正确执行此操作,则需要增强 Globalize 文化生成器以包含'g'
格式开关,然后在客户端使用此确切开关来格式化日期:
Globalize.format( new Date(2012, 1, 20), 'g' ); // default date format
这是为什么?因为 'g' 是默认的日期格式。这就是当您简单地调用不带参数DateTime
的 'ToString()
方法时会得到的(这将意味着CultureInfo.CurrentCulture
作为唯一的参数......)。默认格式是最好的,它可以是短的或长的,或者任何其他格式,但这是使用这种文化的人最常用的格式。
我说这toLocaleString()
对所有网络浏览器都是错误的。这是为什么?那是因为它将使用 Web 浏览器设置,而不是服务器端检测到的文化。这意味着,您可能在同一个网页中混合了不同的文化。如果您的某些日期在服务器端格式化而其他日期在客户端格式化,则可能会发生这种情况。这就是为什么我们需要从服务器端传递(检测到的)文化。
顺便提一句。如果您决定将区域首选项对话框包含到您的 Web 应用程序中,则不匹配会更加明显,因为toLocaleString()
不会遵循用户设置...