使用UTC日期时间值

时间:2017-10-11 08:44:14

标签: javascript asp.net-mvc datetime momentjs utc

在我的应用程序中,所有日期时间都以UTC格式存储在数据库中。当服务器端代码呈现HTML时,这些日期将转换为正确的时区。

但是,我在使用moment.js将客户端JavaScript中的UTC日期时间转换为本地时区时出现问题。

在下面的示例中,存储在数据库中的UTC日期为2017-10-10 16:53:10.127。我在英国,夏令时仍然有效,所以我希望日期时间为2017年10月10日17:53:10 - 比UTC值提前一小时。

function foo() {
    $.get({
        url: '/foo/583',
        cache: false,
        success: function(data) {
            console.log('Raw:        ' + data.UpdatedAtUtc);

            var utc = moment.utc(data.UpdatedAtUtc);
            console.log('Moment UTC: ' + utc.format('DD MMM YYYY HH:mm:ss'));
            console.log('Moment Local:' + utc.local().format('DD MMM YYYY HH:mm:ss'));
        }
    });
}

此功能的控制台输出如下:

Raw:          /Date(1507650790127)/
Moment UTC:   10 Oct 2017 15:53:10
Moment Local: 10 Oct 2017 16:53:10

使用this online converter,我已经确认JSON中的原始日期时间值代表我的UTC值(10月10日,UTC时间下午4:53:10),所以我很高兴MVC后端正确转换UTC值而不会弄乱时区。

调试器在客户端报告的值是正确的“/ Date(1507650790127)/”,这是我传递给当前提供的 utc()方法的值.js理解它会将其解释为UTC日期时间值。

utc()方法的documentation说明:

  

如果您希望以UTC日期与日期互动,请使用moment.utc:

     
    

moment.utc( '2016-01-01T23:35:01');

  

所以我推测我正确使用它。但是,我测试的输出表明日期时间值被视为本地时间,因为 utc()方法的格式化输出已经削减了一个小时的时间,将其写入控制台为15:53而不是16:53

如何正确初始化带有/ Date()/字符串的moment.js?

1 个答案:

答案 0 :(得分:0)

感谢VincencoC和robertklep指出从我的MVC后端传递的值是问题 - moment.js正常工作。

事实证明,Controller.JSON()方法假设我的日期在本地时区,并在序列化为JSON之前将它们从本地转换为UTC。

为了解决这个问题,我在MVC项目中添加了一个新类,使用NuGet的Newtonsoft JSON.Net库提供自定义JSON序列化:

public class JsonNetResult : JsonResult
{
    private readonly string _json;

    public JsonNetResult(object data, JsonRequestBehavior behavior = JsonRequestBehavior.AllowGet)
    {
        _json = JsonConvert.SerializeObject(data, Formatting.None, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
        JsonRequestBehavior = behavior;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/json";
        response.Write(_json);
    }
}

为了使用该类,我更新了相关的操作以返回JsonNetResult而不是JsonResult并更改了返回值,如下所示:

public JsonNetResult AuditTrail(int id)
{
    var data = GetAuditData(id);

    //return this.Json(data, JsonRequestBehavior.AllowGet);
    return new JsonNetResult(data);
}

现在以“YYYY-MM-DD HH:mm:ss”格式而不是/ Date()/格式化我的所有日​​期时间,并且在此过程中不进行时区转换。