不能 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)
试图将已由 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)