从 moment.js 对象中移除时区

60

我正在使用 datetimepicker.js,它的date函数返回一个moment.js对象。它包含本地UTC偏移量,并且我的原始日期有不同的偏移量。

我的原始日期:

2015-10-01T15:00:00.000Z

我在日期时间选择器中显示的内容为 (DD-MM HH:mm):

01-10 15:00

我能给你的:

2015-10-01T15:40:00+01:00

我想要什么:

2015-10-01T15:40:00+00:00

注意我在最后去掉了+01的偏移量。

如何在适用于任何本地UTC的情况下实现这一点?也就是说,不需要手动删除01(因为它可能是根据用户位置而变化的任何其他本地偏移量)。

var momentDate = timePicker.data("DateTimePicker").date();
console.log(momentDate.format());
//this prints  2015-10-01T15:40:00+01:00

请提供一些代码或一个fiddle来演示吗?使用moment库很容易实现,但是我不知道在这个datetimepicker控件中使用了哪些API。 - Matt Johnson-Pint
5个回答

82

您需要明确指定格式。

尝试这样做:

momentDate.format('YYYY-MM-DDTHH:mm:ss')

这将会得到以下结果:

2015-10-01T15:40:00


2
这会移除时区吗? - Jordan
是的,完全正确 @Jordan - Nour

42

看起来您想让用户选择基于UTC的日期和时间。因此,最好的方法是在创建时将选择器设置为UTC模式。我不熟悉这个特定的datetimepicker,但假设它在内部某处执行以下操作:

var m = moment([year, month-1, day, hour, minute]);

那么它应该做这个:

var m = moment.utc([year, month-1, day, hour, minute]);

(这里显示的变量将来自于选择器控件内部。)

理想情况下,选择器控件应该包括一个设置UTC模式的功能,以便在被您告知时可以在内部执行此操作。

如果它没有这样的功能,您仍然可以进行补偿。不幸的是,您不能只调用.utc(),因为那会给出不同于用户选择的时间。所以,您需要通过将UTC时间移动原始时刻的偏移量来进行补偿。

var m = // moment value from the picker
var result = moment(m).utc().add(m.utcOffset(), 'm');

然后您可以对结果调用 format 或其他您想要的方法。请注意,原始的 moment 对象通过 moment(m) 进行了 克隆,这样偏移量不会丢失,并且切换到 UTC 不会干扰选择器的内部行为。

此外,请注意,像这样进行 位移 通常是一种 hack,如果操作不当可能会导致错误。在这个例子中是可以的,因为在应用调整时 moment 对象已经处于 UTC 模式下。但作为一般解决方案,应避免使用位移。最好的选择是一开始就将控件置于 UTC 模式。


对我而言,只有使用var result = moment(m).add(m.utcOffset(), 'm').utc();才能正常工作。如果utc()在add之前,utcOffset不会输出任何东西。 - TheFullResolution
@TheFullResolution - 我认为你可能使用了 m.utc().add... 而不是 moment(m).utc().add... - Matt Johnson-Pint

16

试试这个:

let str = '2015-10-01T15:40+01:00';
let moment = moment(str).utcOffset(str)
console.log(moment.format('DD/MM/YYYY HH:mm'))
<script src="https://momentjs.com/downloads/moment.js"></script>


12

这对我有用:

let date = "2017-02-01 15:20:00.00";
let pattern = "YYYY-MM-DD HH:mm:ss.SS"
let d = moment(date, pattern).utc(false);

它仍然会说它考虑了时区,但我发现它并没有。

LOG: 'ParseDateStr::2017-2-1 15:20:00.0000000
ParsedDate::Wed Feb 01 2017 15:20:00 GMT+0100 (Central European Standard Time)'

通常情况下,只需要使用moment(date, pattern),它会解析为16:20:00


1
不是一个干净的解决方案,但你可以这样做。
momentDate.format('YYYY-MM-DDTHH:mm:ss') + '00:00';

这将删除时区,然后重新添加'00:00'部分。这是对Matt答案的扩展。
这将给你:

2015-10-01T15:40:00+00:00


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接