使用moment.js

时间:2015-09-17 16:58:30

标签: asp.net-mvc kendo-ui momentjs

尝试将已经由momentjs转换为UTC的日期时间对象传递给我的MVC控制器。我使用的是kendo datetimepicker,由于某种原因,moment.utc只是不会向控制器发送我想要的值。例如,我输入' 9/17/2015 12:00 AM'进入我的kendo datetimepicker。我得到的价值如下:

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

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

var t1 = new Date(start);

读作星期四2015年9月17日00:00:00 GMT-0700(太平洋夏令时){}。看起来还不错。接下来我尝试使用以下时间转换为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。而不是转换所有它似乎做的是采取日期对象,让我告诉它嘿,这是utc'它说' ok' (通过标记_isUTC:true),即使它仍在那里保存GMT值

即使我决定先制作一个瞬间对象,然后在其上运行UTC?它仍然是相同的:

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

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

1 个答案:

答案 0 :(得分:0)

一些事情:

  • 甚至不要查看以下划线为前缀的字段。它们是moment.js的内部设计的一部分,而不是直接消费。在许多情况下,必须组合几个字段才能获得正确的结果。这在公共API的功能中考虑,例如format

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

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

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

  • Moment有两种不同的功能可以使用UTC。

    • moment.utc(value) - 按UTC
    • 解释值
    • m.utc() - m是任何时刻的实例,值转换为UTC

    请注意,第二个通过将现有实例从“本地模式”切换为“UTC模式”来突变现有实例。如果你想链接函数,它也会返回实例,但它也会修改原始实例。

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

    此外,大多数现代浏览器已经直接在.toISOString()对象上支持Date,因此,除非您定位旧浏览器,否则您可能根本不需要片刻。< / p>

  • 您说"2015-09-17T07:00:00+00:00"不是UTC时间,但实际上。您在UTC-7中以00:00开始,相当于UTC + 0中的7:00。因此,尽管跳过了几个不必要的步骤,但最后时刻仍然是正确的 - 至少使用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)