尝试将已经由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时间。这是我输入的确切时间。我在这里做错了什么?
答案 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)