您不能在服务器上执行 ToLocalTime(),因为服务器是 UTC。您需要:
- 让客户端以某种方式发送它的时区(这可能很棘手,因为默认情况下您不会通过 GET 请求获取它)
- 让服务器向下发送 UTC,客户端将其转换为本地时间。如果您使用 AJAX,这自然会发生,但仅使用 razor view 会很麻烦:
这是我用来使 Razor 视图的第二种方法非常容易的技巧:
服务器使用特殊类“.mytime”和自定义属性“utc”中指定的 utc 时间(来自服务器)呈现元素:
<div class="mytime" utc ="@date.ToString("o")"></div>
<span class="mytime" utc ="2018-12-28T02:36:13.6774675Z"></span>
注意 .ToString("o") 是 UTC 时间的写法。
然后有一个本地jQuery函数遍历所有带有“mytime”类的元素,读取属性中的UTC值,然后进行转换。
$(function () {
var key = $(".mytime").each(function (i, obj) {
var element = $(this); // <div> or <span> element.
var utc = element.attr("utc"); // "2018-12-28T02:36:13.6774675Z"
var d = new Date(utc);
var l = d.toLocaleString(); // Runs client side, so will be client's local time!
element.text(l);
});
});
然后我创建了一个用于渲染的 MVC razor 助手:
public static MvcHtmlString LocalDate(this HtmlHelper helper, DateTime date)
{
// Must use MvcHtmlString to avoid encoding.
return new MvcHtmlString(String.Format("<span class=\"mytime\" utc =\"{0}\"></span>", date.ToString("o")));
}
所以现在我的视图只包括上面的 JQuery 和脚本,然后:
Created at @Html.LocalDate(Model.CreatedDate)
因为这是在 jQuery 的 $() onload 中调用的,所以它会在服务器一直发送下来之后运行。
工作就像一个魅力!