2014-09-15 11 views
5

Jak sformatować daty ISO BC za pomocą pliku Moment.js?Jak formatować daty BC (np. "-700-01-01")?

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

Z jakiegoś powodu działa notacja roczna z 6 cyframi. Czy to "właściwa" droga? Dlaczego nie działa notacja taka jak "-700-01-01"?

+3

Co do zasady nie powinieneś tego chcieć. Obliczenia dat tak dawno temu będą z gruntu niewiarygodne i błędne, ponieważ kalendarz gregoriański po prostu nie był wtedy znormalizowany. W skrócie: nigdy nie było "1 stycznia" zgodnie z kalendarzową logiką Moment.js, w 700BC jedynym sporadycznie używanym kalendarzem był [Kalendarz Numa] (http://en.wikipedia.org/wiki/ Roman_calendar # Calendar_of_Numa), który liczył 355 dni każdego roku. Kalendarz gregoriański nie był zdalny do 1752AD. –

+1

jest kilka powodów, dla których warto to zrobić - może użytkownik musi przedstawić pewne dane na osi czasu wykonane przez "Zazall" narzędzie javascript, a zatem to żądanie jest całkowicie poprawne. Nikt nie wątpi, że daty BC nie są wiarygodne, jeśli chodzi o dzień tygodnia, ale nadal musi być sposób, jak to zrobić. Świat nie zaczął się 1.1.1970 ... :) – Radek

Odpowiedz

3

To nie jest problem specyficzny dla Moment.js; to samo dzieje się, jeśli spróbujesz zainicjować obiekt Date() za pomocą napisu, którego używasz. Jeśli tworzysz go jako Date() przedmiotu pierwszy i ręcznie przypisać roku użyciu setYear() to jednak przyjąć datę -700:

var date = new Date(); 

date.setYear(-700); 

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

Jednak jak Niels Keurentjes has pointed out obliczenia data tak daleko z powrotem dostać dość skomplikowane i nie może być w ogóle niezawodny.

Jeśli chcesz „-700-01-01” można skonfigurować rok, miesiąc i dzień oddzielnie:

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

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

Jako, czy 1 dzień od 1 miesiąca w 700BC był rzeczywiście w piątek ... sam będziesz musiał to sprawdzić.

+1

Dzięki, tworzenie daty jako "nowej daty (-700, 0, 1)" działa naprawdę dobrze, ale potrzebuję notacji serializowalnej, a data ISO jest do tego idealna. Nie można tak naprawdę porównać Moment.js z domyślnym analizatorem dat, moment.js oferuje zestaw funkcji Data i rozwiązuje niezgodności między przeglądarkami. Powiedziałbym, że ten * is * a moment.js jest specyficznym problemem, który może być rozwiązany przez moment.js. Jakąkolwiek wskazówkę, dlaczego działa sześć cyfr lat? –

0

W twoim przykładzie znak minus jest również używany jako separator między latami, miesiącami i dniami. Jak podkreślasz w komentarzu odpowiedzi James'a, używanie komy jako separatora pomaga odróżnić.

Powiązane problemy