不能 return 具有 moment.js 的 utc 日期时间

cannot return a utc datetime with moment.js

试图将已由 momentjs 转换为 UTC 的日期时间对象传递到我的 MVC 控制器。我正在使用 kendo 日期时间选择器,出于某种原因,moment.utc 不会向控制器发送我想要的值。例如,我在 kendo 日期时间选择器中输入“9/17/2015 12:00 AM”。我得到这样的值:

var start = $("#startTime").val();

这给了我 "9/17/2015 12:00 AM" 。伟大的。然后我将其转换为日期对象:

var t1 = new Date(start);

显示为 Thu Sep 17 2015 00:00:00 GMT-0700(太平洋夏令时){}。看起来还是不错的。接下来我尝试使用 moment 转换为 UTC:

var t2 = moment.utc(t1);

这给了我

dt {_isAMomentObject: true, _i: Thu Sep 17 2015 00:00:00 GMT-0700 (Pacific Daylight Time), _isUTC: true, _locale: fu, _d: Thu Sep 17 2015 00:00:0...

没有转换为 utc。而不是转换它似乎做的是获取一个日期对象并让我告诉它 'hey, this is utc' 它说 'ok' (通过标记 _isUTC:true),即使它仍在保存 GMT 值那里

即使我决定先创建一个 moment 对象,然后 运行 UTC 在上面?结果还是一样:

var t2 = moment(t1);
var t3 = moment.utc(t2);

所以这些值中的任何一个,如果我 运行 .format() 在它们上面(这是我需要传递给我的控制器的),我总是得到“2015-09-17T07:00:00 +00:00”,这不是 UTC 时间。这是我输入的确切时间。我在这里做错了什么?

几件事:

  • 甚至不要看带有下划线前缀的字段。它们是 moment.js 内部设计的一部分,并不意味着直接消费。在许多情况下,必须组合几个字段才能获得正确的结果。这在 public API 的函数中已说明,例如 format.

  • 不要依赖 Date 对象来进行解析。跨浏览器的结果可能不一致。 Moment 有自己的解析器,你可以这样使用它:

    moment("9/17/2015 12:00 AM","M/D/YYYY h:mm A")
    

    但是,在您的特定情况下,您实际上根本不需要解析任何字符串。你说你正在使用 Kendo 的 DateTimePicker 控件,所以你应该使用 value 函数,它已经 returns 一个 Date 对象。

  • Moment 有两个不同的函数用于处理 UTC。

    • moment.utc(value) - 根据 UTC
    • 解释值
    • m.utc() - 其中 m 是任何时刻实例,将值 转换为 UTC

    请注意,第二个 通过将现有实例从 "local mode" 切换为 "UTC mode" 来改变 。如果你想链接函数,它也会 returns 实例,但它也会修改原始实例。

  • 如果您希望输出显示 +00:00 偏移量,则可以在转换为 UTC 后使用 format。但是,如果你想显示 Z (这通常是首选),你可以只调用 .toISOString() 而无需先明确转到 UTC - 因为该函数 always输出 UTC。

    此外,大多数现代浏览器 已经 直接在 Date 对象上支持 .toISOString(),因此除非您的目标是较旧的浏览器,否则您可能不需要片刻。

  • 你说"2015-09-17T07:00:00+00:00"不是UTC时间,实际上。您从 UTC-7 中的 00:00 开始,相当于 UTC+0 中的 7:00。因此,尽管跳过了几个不必要的步骤,但 moment 最终还是做对了——至少 t3 是这样。

您可以使用以下任一方法简化您的代码:

var picker = $("#startTime").data().kendoDateTimePicker;
var dt = picker.value();  // dt is a Date object
var m = moment(dt);       // m is a moment object
m.utc();                  // m has been converted to UTC
var s = m.format();       // ex: "2015-09-17T07:00:00+00:00"

或者...

var picker = $("#startTime").data().kendoDateTimePicker;
var dt = picker.value();  // dt is a Date object
var m = moment(dt);       // m is a moment object
var s = m.toISOString();  // ex: "2015-09-17T07:00:00Z"

或者...

var picker = $("#startTime").data().kendoDateTimePicker;
var dt = picker.value();  // dt is a Date object
var s = dt.toISOString(); // ex: "2015-09-17T07:00:00Z"  (requires browser support)