Co oznacza ten format T00: 00: 00.000Z?

Odpowiedzi:

86

Jest to część reprezentacji daty ISO-8601 . Jest niekompletna, ponieważ pełna reprezentacja daty w tym wzorze powinna również zawierać datę:

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

Jeśli spróbujesz przeanalizować tę datę tak, jak jest, pojawi się Invalid Datebłąd:

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

Wydaje mi się, że sposobem na przeanalizowanie znacznika czasu w tym formacie jest połączenie z dowolną datą

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

Następnie możesz wyodrębnić tylko żądaną część (część z sygnaturą czasową)

var d = new Date('2015-03-04T00:00:00.000Z');
console.log(d.getUTCHours()); // Hours
console.log(d.getUTCMinutes());
console.log(d.getUTCSeconds());
nanndoj
źródło
2
Blisko - należy użyć getUTCHours, getUTCMinutesi getUTCSeconds. W przeciwnym razie nadasz zachowanie lokalnej strefy czasowej, które przyniesie różne wyniki w zależności od strefy czasowej i dnia, w którym wybierzesz - ze względu na czas letni.
Matt Johnson-Pint
14

Sugeruję użycie moment.jsdo tego. W chwili.js możesz:

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

teraz, gdy masz już odpowiedni format na jakiś czas, przeanalizuj go, jeśli jest prawidłowy:

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

aby uzyskać części czasu, możesz zrobić coś takiego:

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"));

Więcej informacji o momentjs http://momentjs.com/

gone43v3r
źródło
2
Powinieneś być w stanie przeanalizować to bezpośrednio w konstruktorze momentu z odpowiednim ciągiem formatu. (moment przyjmie aktualną datę, jeśli nie jest to część wartości). Możesz również rozważyć moment.utc(...), czy wynikowa wartość jest w tej samej strefie UTC, co oryginalna wartość.
Matt Johnson-Pint
4

Jak jedna osoba mogła już zasugerować,

Przekazałem ciąg daty ISO 8601 bezpośrednio do chwili, tak ...

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

lub

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

każde z tych rozwiązań da ten sam rezultat.

`console.log(moment('2019-11-03T05:00:00.000Z').utc().format('MM/DD/YYYY')) // 11/3/2019`
that_developer
źródło
Dobrze byłoby również wyraźnie powiązać i polecić korzystanie z biblioteki javascript moment.js , wyjaśniając powyższy kod.
VKen
To nie daje odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować każdy post ; zamiast tego udziel odpowiedzi, które nie wymagają wyjaśnień od pytającego . - Z recenzji
Phil Tune
@PhilTune masz rację, myślę, że mój mózg poruszał się tak szybko, że technicznie odpowiadałem na komentarz, a nie na pytanie
that_developer
1

Użyj DateTimeFormatter ISO_DATE_TIME = DateTimeFormatter.ISO_DATE_TIME; zamiast DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")lub dowolnego wzorca

To rozwiązało mój problem poniżej

java.time.format.DateTimeParseException: nie można przeanalizować tekstu „2019-12-18T19: 00: 00.000Z” w indeksie 10

Shahid Hussain Abbasi
źródło
Rozwiązano mój problem z konwersją czasu z typu ciągu na OffsetDateTime
RSH