这个格式 T00:00:00.000Z 是什么意思?

161

请问有人能解释一下 JavaScript 中这种类型的格式吗?

 T00:00:00.000Z

如何解析它?


4
http://en.wikipedia.org/wiki/ISO_8601 - Drew
13
T代表“时间”,通常用于将日期和时间部分分离。Z代表该值是基于协调世界时的。 - Matt Johnson-Pint
1
以Z结尾的日期时间也被称为Zulu时间。 - strattonn
7个回答

169

这是ISO-8601日期表示法的一部分。它不完整,因为这种模式的完整日期表示法还应包含日期:

2015-03-04T00:00:00.000Z //Complete ISO-8601 date

如果您直接解析此日期,将会收到一个Invalid Date错误:

new Date('T00:00:00.000Z'); // Invalid Date

所以,我想解析这种格式的时间戳的方法是将其与任何日期连接起来。

new Date('2015-03-04T00:00:00.000Z'); // Valid Date

然后你可以提取你想要的部分(时间戳部分)。

var d = new Date('2015-03-04T00:00:00.000Z');
console.log(d.getUTCHours()); // Hours
console.log(d.getUTCMinutes());
console.log(d.getUTCSeconds());

3
关闭 - 你应该使用getUTCHoursgetUTCMinutesgetUTCSeconds。否则,你会传递本地时区的行为,这将根据选择的时区和日期而产生不同的结果-由于夏令时的影响。 - Matt Johnson-Pint

19

我建议您使用moment.js来完成此操作。 在 moment.js 中,您可以:

var localTime = moment().format('YYYY-MM-DD'); // store localTime
var proposedDate = localTime + "T00:00:00.000Z";

现在你有了正确的时间格式,如果它是有效的,请对其进行解析:

var isValidDate = moment(proposedDate).isValid();
// returns true if valid and false if it is not.

要获取时间部分,您可以尝试以下操作:

var momentDate = moment(proposedDate)
var hour = momentDate.hours();
var minutes = momentDate.minutes();
var seconds = momentDate.seconds();

// or you can use `.format`:
console.log(momentDate.format("YYYY-MM-DD hh:mm:ss A Z"));

有关momentjs的更多信息http://momentjs.com/


2
你应该能够使用适当的格式字符串直接在moment构造函数中解析它。(如果日期不是值的一部分,moment将假定当前日期。) 此外,你可能考虑使用moment.utc(...),这样生成的值与原始值在同一个UTC时区。 - Matt Johnson-Pint
你能告诉我如何将格式化的日期版本转换回原始日期版本T00:00:00.000Z吗? - Chronoviser
你确定使用这个结果会给你T00:00:00.000Z格式吗? - Ugur
从2023年开始,我建议您使用Luxon而不是Moment。Moment已经不再进行积极的开发。 - undefined

16

就像可能已经有人建议过的那样,

我直接将 ISO 8601 日期字符串传递给了 moment,如下所示...

moment.utc('2019-11-03T05:00:00.000Z').format('MM/DD/YYYY')
或者
moment('2019-11-03T05:00:00.000Z').utc().format('MM/DD/YYYY')

无论选择哪种解决方案,都会得到相同的结果。

console.log(moment('2019-11-03T05:00:00.000Z').utc().format('MM/DD/YYYY')) // 11/3/2019

有关momentjs的更多信息 http://momentjs.com/


在解释上面的代码时,建议明确地链接和推荐使用 moment.js JavaScript 库。 - VKen
这并没有为问题提供答案。一旦您获得足够的声望,您将能够评论任何帖子;而不是这样,提供不需要来自提问者的澄清的答案。- 来自评审 - Phil Tune
@PhilTune 你说得对,我想我的大脑思维太快了,以至于我实际上是在回复评论而不是问题。 - that_developer

1

既然有人问如何实现:

使用momentjs轻而易举:

// install using yarn
yarn add moment
// or install using npm 
npm i moment 

那么你可以按照想要的格式提取日期,像这样做:
import 'moment' from moment;

let isoDate = "2021-09-19T05:30:00.000Z";

let newDate =  moment.utc(isoDate).format('MM/DD/YY');
console.log('converted date', newDate); // 09/23/21 
 
let newDate2 = moment.utc(isoDate).format("MMM Do, YYYY");
console.log('converted date', newDate2); // Sept 24, 2021

1
现有的答案已经解决了这个问题。我还发现这个时间戳转换器非常有用,它可以快速地处理ISO 8601和其他时间戳。它将帮助您解码和编码特定的时间:

https://time.lol/


1
请使用DateTimeFormatter ISO_DATE_TIME = DateTimeFormatter.ISO_DATE_TIME;代替DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")或任何模式,以解决我的问题。下面是我解决问题的方法:

java.time.format.DateTimeParseException: Text '2019-12-18T19:00:00.000Z' could not be parsed at index 10


这解决了我的时间从字符串类型转换为OffsetDateTime的问题。 - TarasH

0

我曾经遇到过类似的问题,我通过在将日期/时间发送到服务器之前进行转换来解决它:

示例:(UTC巴西)我输入了“15/12/2020 22:30:00”,然后它发送了:“2020-12-16T01:30:00.000Z”。 您可以使用以下方式进行转换:

var date = new Date('2020-11-06T01:30:00.000Z');
console.log(date.toLocaleDateString());
console.log(date.toLocaleString());
console.log(date.toLocaleTimeString());

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