关于javascript:ASP.NET MVC Controller / View显示本地时间

ASP.NET MVC Controller/View display local time

我有一个ASP.NET MVC应用程序,它以UTC格式存储所有SQL DateTime,因此无论客户端从哪个时区访问该站点,时间都是一致的。

现在,我想重新向用户显示正确的时间,所以每次在我的View中显示时间我都会使用:

1
timeVariable.ToLocalTime();

但是,。ToLocalTime()基于服务器,而不是客户端。

我是否需要在客户端上使用JavaScript处理此问题?

我可能可以将时区作为请求的一部分传递并让控制器处理该事件,但我假设有更好的方法来执行此操作。 或者不存在?

在此先感谢您的帮助!

-Matt


对于Asp.Net MVC + jQuery,我创建了一个DisplayTemplate和脚本来帮助解决这个问题。

型号类:

1
2
3
4
5
6
7
8
9
10
11
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public class SampleModelWithDate
{
    [UIHint("UTCTime")]
    [DataType(DataType.DateTime)]
    public DateTime Date { get; set; }
}

DisplayTemplate:Views Shared DisplayTemplates UTCTime.cshtml

1
2
@model DateTime
<span class="UTCTime">@Model</span>

添加到Views Shared_Layout.cshtml,或添加到您的视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    $(function () {
        // Determine timezone offset in milliseconds
        // from: http://www.w3schools.com/jsref/jsref_getTimezoneOffset.asp
        var d = new Date()
        var offsetms = d.getTimezoneOffset() * 60 * 1000;
        $('.UTCTime').each(function () {
            try
            {
                var text = $(this).html();

                var n = new Date(text);
                n = new Date(n.valueOf() - offsetms);

                $(this).html(n.toDateString() +"" + n.toLocaleTimeString());

                $(this).attr("Converted from UTC" + text);
            }
            catch (ex) {
                console.warn("Error converting time", ex);
            }
        });
    });

当然要清理一下,它有点冗长,所以你可以看到发生了什么。


几乎所有我见过的将时间转换为当地时间的网站都要求用户在创建帐户时指定他或她的时区。 Gmail就是一个例子,但还有很多其他例子。

我发现很多尝试在IP地址上使用javascript或反向查找的解决方案都容易出现故障和边缘情况。


除了德里克的回答,
"在将字符串转换为javascript中的日期之前,将'UTC'附加到字符串中。" 使用JavaScript将UTC日期时间转换为本地日期时间

UTCTime可以自动转换为本地时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    $(function () {
        var d = new Date()
        $('.UTCTime').each(function () {
            try
            {
                var text = $(this).html() + ' UTC'; //Append ' UTC'

                var n = new Date(text);

                $(this).html(n.toDateString() +"" + n.toLocaleTimeString());

                $(this).attr("title","Converted from UTC" + text);
            }
            catch (ex) {
                console.warn("Error converting time", ex);
            }
        });
    });