2014-09-15 5 views
5

Wie formatieren ISO Datumsangaben BC mit Moment.js?Wie formatieren BC-Daten (wie "-700-01-01")?

moment("-700-01-01").year();  // 700 (WRONG) 
moment("-0700-01-01").year(); // 700 (WRONG) 
moment("-000700-01-01").year(); // -700 (RIGHT) 

Aus irgendeinem Grund funktioniert ein Jahr Notation mit 6 Ziffern. Ist das der "richtige" Weg? Warum funktioniert die Notation wie nicht?

+3

Als allgemeine Regel sollten Sie dies sowieso nicht wollen. Datumsberechnungen vor langer Zeit werden unglaublich unordentlich und per Definition falsch sein, weil der Gregorianische Kalender damals einfach nicht standardisiert war. Kurz gesagt: Es gab nie einen "1. Januar" gemäß der Kalenderlogik von Moment.js, in 700 v. Chr. War der einzige Kalender, der sporadisch verwendet wurde, der [Kalender von Numa] (http://en.wikipedia.org/wiki/) Roman_calendar # Calendar_of_Numa), der jedes Jahr 355 Tage zählte. Der Gregorianische Kalender war bis 1752 nicht zuverlässig. –

+1

Es gibt mehrere Gründe, dies zu tun - vielleicht muss der Benutzer einige Daten auf einer Timeline von "usuall" JavaScript-Tool, und damit diese Anfrage ist vollständig gültig. Niemand bezweifelt, dass Daten BC nicht zuverlässig sind, wenn es um den Tag der Woche oder so geht, aber dennoch muss es Weg geben, wie man es macht. Welt startete nicht am 1.1.1970 ... :) – Radek

Antwort

3

Dies ist kein Moment.js-spezifisches Problem; Das gleiche passiert, wenn Sie versuchen, ein Date() Objekt mit der Zeichenfolge zu initialisieren, die Sie auch verwenden. Wenn Sie es als Date() Objekt erstellen erste und manuell das Jahr vergeben setYear() verwenden, funktioniert aber es ein Datum von -700 akzeptieren:

var date = new Date(); 

date.setYear(-700); 

moment(date).year(); 
> -700 

jedoch als Niels Keurentjes has pointed out, dieses Datum Berechnungen erhalten weit zurück ziemlich kompliziert und kann nicht sein, überhaupt zuverlässig.

Wenn Sie „-700-01-01“ können Sie das Jahr konfigurieren, Monat und Tag separat:

date.setYear(-700); 
date.setMonth(0); 
date.setDate(1); 

console.log(date); 
> Fri Jan 01 -700 11:53:57 GMT+0000 (GMT Standard Time) 

Zur Frage, ob der 1. Tag des 1. Monats in 700BC war eigentlich ein Freitag ... du wirst selbst nachsehen müssen.

+1

Danke, ein Datum als 'neues Datum (-700, 0, 1)' zu erstellen funktioniert zwar gut, aber ich brauche eine serialisierbare Notation und ISO-Datum ist dafür perfekt. Sie können Moment.js nicht mit dem Standard-Date-Parser vergleichen, da Moment.js eine Obermenge von Date-Funktionen bietet und Inkompatibilitäten zwischen Browsern löst. Also würde ich sagen, dass dies * ein Moment ist. Js spezifisches Problem, das von moment.js gelöst werden könnte. Irgendwelche Hinweise darauf, warum 6-stellige Jahre funktionieren? –

0

In Ihrem Beispiel wird das Minuszeichen auch als Trennzeichen zwischen Jahren, Monaten und Tagen verwendet. Wie Sie im Kommentar der Antwort von James zeigen, hilft die Verwendung von Koma als Trennzeichen, zu unterscheiden.

Verwandte Themen