尝试用 moment.js 解析 ASP.NET 日期是库的错误,还是我的代码错误?

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

var input = "/Date(1450399658897)/";
var m_utc = moment.utc(input);

我的印象是 moment.utc(...) 的全部意义在于将数据解析为 UTC 日期。然而,它似乎实际上将其解析为当地时间,至少在发送糟糕的 ASP.NET JSON 日期格式时是这样。

在此处查看 JS Fiddle:
http://jsfiddle.net/6g0nmr3e/5

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

我是不是误会了moment.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 个来自 entity framework 的日期时间字段。不幸的是,这个问题似乎没有什么好的解决办法。链接的解决方案仅适用于正在生成的完整实体,对投影对象没有帮助。似乎没有针对所有具体化的事件挂钩。

在我的特定情况下,我正在为 MVC 视图创建模型 class,因此我将 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 实体,所以我也对这些实体执行此操作,以避免您将看到的大多数其他答案中给出的反射开销。然而,'best' 解决方案将是指定实体字段的 DateTimeKind 的某种方式,并通过在该字段上进行的任何投影(包括匿名类型)进行。但据我所知,这对于当前版本的 EF 是不可能的。事实上,我必须记住为所有模型上的每个 UTC DateTime 字段执行此操作,这些字段被推送到 javascript 客户端。