这是尝试解析带有时刻的 ASP.NET 日期.js库的错误还是我的代码错误

Is this attempt to parse a ASP.NET date with moment.js a bug with the library, or an error with my code?

本文关键字:错误 日期 js 代码 我的 NET ASP 时刻      更新时间:2023-09-26
var input = "/Date(1450399658897)/";
var m_utc = moment.utc(input);

我的印象是 moment.utc(...( 的全部要点解析数据,就好像它是 UTC 日期一样。 然而,它似乎实际上将其解析为本地时间,至少在以糟糕的 JSON 日期格式发送时 ASP.NET。

在这里看JS小提琴:
http://jsfiddle.net/6g0nmr3e/5

如果您居住在没有 UTC 偏移量的时区,则不会有太大帮助,但它确实表明该值为 2015-12-17 19:47 Z。 但是,moment.js不是解析为 UTC,而是解析为本地,然后将该值转换为 UTC,给出 2015-12-18 00:47 Z。

我是不是误会了时刻.utc(...(? 还是我应该将此报告为错误?

所以根本问题是我没有正确读取javascript日期输出。 我解释这个

Thu Dec 17 2015 19:47:38 GMT-0500 

作为这个

(Thu Dec 17 2015 19:47:38 GMT)-0500 

当它实际上是这个

(Thu Dec 17 2015 19:47:38) GMT-0500 

来自服务器的日期不正确。 Matt 的直觉是正确的,它是来自实体框架的 DateTimeKind.Unspecified datetime 字段。 不幸的是,这个问题似乎没有任何好的解决方案。 链接解决方案仅适用于正在生成的完整实体,对投影对象没有帮助。 似乎没有适用于所有具体化的事件钩子。

在我的特殊情况下,我正在为 MVC 视图创建一个模型类,所以我将 setter 调整为如下所示:

private DateTime _TimestampUTC;
public DateTime TimestampUTC
{
    get { return _TimestampUTC; }
    set
    {
        switch (value.Kind)
        {
            case DateTimeKind.Unspecified:
                _TimestampUTC = DateTime.SpecifyKind(value, DateTimeKind.Utc);
                break;
            case DateTimeKind.Local:
                _TimestampUTC = value.ToUniversalTime();
                break;
            case DateTimeKind.Utc:
                _TimestampUTC = value;
                break;
        }
    }
}

我还使用 T4 生成我的 POCO 实体,所以我也使用这些实体来避免您将看到的大多数其他答案中给出的反射开销。 但是,"最佳"解决方案是指定实体字段的 DateTimeKind 并使其贯穿在该字段上进行的任何投影(包括匿名类型(的方法。 但据我所知,这在当前版本的 EF 中是不可能的。 实际上,我必须记住对所有推送到 javascript 客户端的模型上的每个 UTC DateTime 字段执行此操作。