经过一番搜索,我最终将Thread
的CurrentCulture值设置为控制器操作方法中的CultureInfo("en-US"):
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
如果想要在每个视图中使用此设置,则可以考虑一些其他选项。
关于CurrentCulture
属性的值:
此属性返回的CultureInfo对象及其相关对象,可确定日期、时间、数字、货币值的默认格式,文本的排序顺序、大小写约定和字符串比较。
来源:MSDN CurrentCulture
注意:如果控制器已经使用 CultureInfo("en-US")
或类似设置运行,其中日期格式为 "MM/dd/yyyy"
,则前面的CurrentCulture
属性设置可能是可选的。
在设置CurrentCulture
属性后,在视图中添加代码块将日期转换为"M/d/yyyy"
格式:
@{
var shortDateLocalFormat = "";
if (Model.AuditDate.HasValue) {
shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
}
}
@shortDateLocalFormat
在上面的代码中,@shortDateLocalFormat
变量使用 ToString("M/d/yyyy")
格式化。如果使用 ToString("MM/dd/yyyy")
,就像我一开始做的那样,你最终会遇到 前导零问题。同时,正如Tommy所推荐的,ToString("d")
也可以工作。实际上,"d"
代表“短日期模式”,并且可以与不同的文化/语言格式一起使用。
我想上面的代码块也可以用一些 很酷的辅助方法 或类似的东西来替换。
例如
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
}
@shortDateLocalFormat
}
可以与此辅助函数调用一起使用
@DateFormatter(Model.AuditDate)
更新,我发现在使用DateTime.ToString(String, IFormatProvider)方法时有另一种做法。当使用这个方法时,就不需要使用Thread
的CurrentCulture
属性了。作为第二个参数传递CultureInfo("en-US")
--> IFormatProvider给DateTime.ToString(String, IFormatProvider)
方法。
修改后的辅助方法:
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
}
@shortDateLocalFormat
}
.NET Fiddle
DisplayFor
输出的HtmlString
转换为String
,然后将其解析为DateTime
,最后格式化为String
。在我看来,这样做有些复杂了。 - Heretic Monkey