使用moment.js将日期转换为UTC

135

可能这个问题很简单,但我似乎找不到一种方法让 moment.js 返回以毫秒为单位的 UTC 日期时间。这是我的做法:

var date = $("#txt-date").val(),
    expires = moment.utc(date);

你有任何想法,我做错了什么吗?

15个回答

138

这个可以在文档中找到。使用像moment这样的库,我建议您阅读整个文档。这非常重要。

假设输入的文本是以用户的本地时间为基础输入的:

 var expires = moment(date).valueOf();

如果用户被指示实际输入一个UTC日期/时间,则:

 var expires = moment.utc(date).valueOf();

32
从英语翻译成中文。仅返回翻译后的文本:编辑-删除“轻松”。 :) - Matt Johnson-Pint
8
如果我已经有一个带有时区的日期时间,如何将其转换为UTC? - Incerteza
2
那个不起作用。那只是改变了日期上使用的方法,而不是日期本身。 - Colleen
2
@Colleen - 是的,但通常会调用其中一个方法,例如.format(),它将发出UTC值。 它不能更改内部日期值,因为Date已经跟踪UTC时间戳。 它始终只是在其上调用的方法决定是否发出UTC或本地时间。 在这方面,Moment也是一样的。 - Matt Johnson-Pint
使用 moment.utc(anotherMomentDate) - DucDigital
显示剩余2条评论

81
我使用这种方法,它有效。ValueOf 对我没有用。

我使用这个方法并且它有效。ValueOf 对我无效。

moment.utc(yourDate).format()

3
根据文档,此功能将本地时间转换为UTC。 - Kishor Pawar
3
这里有些可疑。我正在使用moment.js ver. 2.17.1,如果 'yourdate' 是 '2017-10-14T21:00:00Z'(en-us),那么上面的代码片段将返回完全相同的结果 '2017-10-14T21:00:00Z',这显然不是UTC时间,因为我在GMT+3时区。正确的结果应该是 '2017-10-15T00:00:00+03:00',你可以通过'moment(yourDate).format()'得到它。 - XDS
"moment": "^2.29.1", -> 这对我有效 ---> moment().utc().format() - moropeza

27

截至: moment.js版本2.24.0

假设你有一个本地日期输入,这是将你的日期时间时间输入转换为UTC的正确方式:

var utcStart = new moment("09:00", "HH:mm").utc();

或者在您指定日期的情况下

var utcStart = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc();

正如您所看到的,结果输出将以协调世界时返回:

//You can call the format() that will return your UTC date in a string 
 utcStart.format(); 
//Result : 2019-06-24T13:00:00 

但是如果按照以下方式进行,它将不会转换为UTC:

var myTime = new moment.utc("09:00", "HH:mm"); 

你只是将输入设置为UTC时间,就好像你在表明myTime是UTC时间一样,......输出将是9:00。


1
如果输入是UTC时间,var s = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc(); 是正确的读取方式。进一步调用s.format()将把它转换为本地时间。 - u tyagi

8

这将是答案:

moment.utc(moment(localdate)).format()

localdate = '2020-01-01 12:00:00'

moment(localdate)
//Moment<2020-01-01T12:00:00+08:00>

moment.utc(moment(localdate)).format()
//2020-01-01T04:00:00Z

4
moment.utc(date).format(...); 

使用这种方法是明智的选择,因为
moment().utc(date).format(...);

行为很奇怪...


2
请问您能详细说明一下 moment().utc(date).format(...) 的奇怪行为吗? - Freeman Lambda
2
行为并不奇怪,这些是不同的方法。第一个 moment.utc(date) 用于 解析 date。第二个 moment().utc(date) 用于 操作 当前时间 (moment()),而 date 参数是无用的,因为在这种情况下 .utc() 不需要任何参数。 - CodingHamster

4

这对我有帮助,其他人也可能会发现它很有用。

let date = '2020-08-31T00:00:00Z'
moment.utc(moment(date).utc()).format() // returns 2020-08-30T22:00:00Z

2
如果所有其他方法都失败了,只需使用本地偏移量的反向重新初始化即可。
var timestamp = new Date();
var inverseOffset = moment(timestamp).utcOffset() * -1;
timestamp = moment().utcOffset( inverseOffset  );

timestamp.toISOString(); // This should give you the accurate UTC equivalent.

1
这个不起作用。起作用的是将 keepOffset 参数设置为 true,例如 moment(timestamp).toISOString(true) - Chris Haines

2

这段代码 moment.utc(stringDate, format).toDate() 对我来说可行。

但是这段代码 moment.utc(date).toDate() 不行。


2

在我的情况下这个有效。

库:"moment": "^2.29.1",

moment().utc().format()

1
这对我有用:

const localtime = 1622516400000
moment(localtime).utc(true).format()

我认为这不是作者所询问的内容。这将删除时区信息并实际修改本地时间。 - Suicide Bunny

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