Что означает этот формат T00: 00: 00.000Z?

87

Может кто-нибудь, пожалуйста, объясните этот тип формата в javascript

 T00:00:00.000Z

А как его разобрать?

Али Акрам
источник
4
Tозначает «время» и обычно отделяет дату от компонента времени. Zозначает, что значение выражено в UTC
Мэтт Джонсон-Пинт,

Ответы:

86

Это часть представления даты 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());
Нанндой
источник
2
Закрыть - Вы должны использовать getUTCHours, getUTCMinutesи getUTCSeconds. В противном случае вы передаете поведение местного часового пояса, которое даст разные результаты в зависимости от того, какой часовой пояс и какую дату вы выберете - из-за DST.
Мэтт Джонсон-Пинт,
14

Я предлагаю вам использовать 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/

ушел43v3r
источник
2
Вы должны иметь возможность анализировать это непосредственно в конструкторе момента с соответствующей строкой формата. (moment примет текущую дату, если она не является частью значения.) Кроме того, вы можете подумать, moment.utc(...)что результирующее значение находится в той же зоне UTC, что и исходное значение.
Мэтт Джонсон-Пинт,
4

Как уже мог предположить один человек,

Я прошел строку даты ISO 8601 прямо в момент, вот так ...

`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`
that_developer
источник
Было бы хорошо также четко связать и рекомендовать использование javascript-библиотеки moment.js, объясняя приведенный выше код.
VKen 05
Это не дает ответа на вопрос. Как только у вас будет достаточная репутация, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют пояснений от спрашивающего . - Из
Phil Tune
@PhilTune, вы правы, я думаю, что мой мозг двигался так быстро, что технически я отвечал на комментарий, а не на вопрос
that_developer
1

Пожалуйста, используйте DateTimeFormatter ISO_DATE_TIME = DateTimeFormatter.ISO_DATE_TIME; вместоDateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss") или любой шаблон

Это устранило мою проблему ниже

java.time.format.DateTimeParseException: текст '2019-12-18T19: 00: 00.000Z' не может быть проанализирован с индексом 10

Шахид Хуссейн Аббаси
источник
Решена моя проблема с преобразованием времени из строкового типа в OffsetDateTime
RSH