2011-12-30 4 views
22

Mam starą aplikację internetową, w której Javascript służy do sprawdzania poprawności niektórych dat. Użytkownicy zazwyczaj używać 2-cyfrowy rok, a ja niedawno odkryta została w roku 1900 oceny 00 zamiast 2000Dlaczego JavaScript ocenia 2-cyfrowy rok 00 jako 1900 zamiast 2000?

if (new Date(tb[0].value) > new Date(tb[1].value)){ 
    alert('Starting date must come before the ending date'); 
    tb[0].focus(); 
    return false; 
} 

Wprowadzanie 1/1/99 w pierwszym polu i 1/1/00 w 2. spowoduje błąd komunikat informujący, że data rozpoczęcia musi być przed datą końcową, ponieważ 99 jest oceniane w 1999 roku, a 00 oznacza 1900.

Oczywiście użytkownicy mogą obejść ten problem za pomocą 4-cyfrowych lat, ale nadal chcę wiedzieć, co można zrobić, aby JavaScript mógł poprawnie oceniać 2-cyfrowe lata.

Moje pytanie brzmi: w jaki sposób mogę uzyskać JavaScript, aby ocenić 00 jako 2000, a nie 1900?

Odpowiedz

21

Czyni to, ponieważ język został stworzony w latach 90. (i pośpiechu). Możesz używać getFullYear() i setFullYear(), aby obsługiwać lata w niezgrabny sposób.

To, co zrobiłem, to napisać kod, aby sprawdzić wartości roku mniejsze niż 100, a jeśli jest większy niż 90 (lub coś podobnego, w zależności od sytuacji) przyjąć, że jest w XX wieku, w przeciwnym razie należy przyjąć 21. .

I @Rachel nie ma sposobu, aby powiedzieć, że biblioteka uruchomieniowa zachowuje się inaczej, a przynajmniej nie ma znormalizowanego sposobu. Tak właśnie działa kod Data.

+0

To wyjaśnia dlaczego, ale czy jest jakiś sposób, aby ocenić JavaScript 00 w roku 2000 zamiast 1900? – Rachel

+0

+1 za historię. Dodane formatowanie kodu :) @Rachel, użyj 'setFullYear()' w oparciu o logikę biznesową, że 00 to 2000. –

+0

Przykro mi, kolego, będę edytować twoje zmiany :-) – Pointy

1

Sposób, w jaki robiłem to w przeszłości, to wybór arbitralnego roku, który pozwala kodowi zakładać, że 2 cyfry lat przed tym arbitralnym rokiem są w latach 1900, a lata później w latach 2000. W przypadku aplikacji księgowej musiałem dostosować Y2K, jeśli dobrze pamiętam, wybrałem rok 1940. Zatem transakcje między 40 a 99 lat były 1940-1999, a transakcje 00-39 były 2000-2039.

19

Najprostszym sposobem jest po prostu zaakceptowanie go w ten sposób i sprawdzenie go.

if (date.getFullYear() < 1970) { 
    date.setFullYear(date.getFullYear() + 100); 
} 

1970 to oczywiście przykładowa wartość, ponieważ trzeba mieć rozsądny punkt krytyczny. Możesz to zrobić jako bieżący rok - x zamiast stałej oczywiście.

+1

+1 dla próbki kodu. –

5

Chrome faktycznie obsługuje to poprawnie, ale IE i Firefox (przynajmniej) nie. Oto moje rozwiązanie:

var x = new Date(input);    //parse the date initially 

if (x!="Invalid Date") { 

    var n = input.split(/[/-]/);  //regex to look for/or - delimited dates 

    if (n[2].length == 2)    //if the input has a 2 digit year 
    { 
     var y = x.getFullYear(); 
     if (y < 1950)     //and the parser decided it's before 1950 
      x.setFullYear(y + 100);  //add a century 
    } 
} 

output = dateToShortString(x);   //custom function to standardize formatting 
+1

Twój kod nie będzie działać zgodnie z oczekiwaniami w dni przestępne w latach, które można podzielić przez 400 (np.1600, 2000, 2400). Na przykład dzień 2/29/00 będzie uważany za nieprawidłową datę, ponieważ rok 1900 nie był rokiem przestępnym, ale rok 2000 był. – Theophilus

0

Czy jest jakiś powód, dla którego nie można zrobić czegoś podobnego? Wielkim założeniem jest to, że jeśli użytkownik wprowadza 2-cyfrowy rok, który prawdopodobnie nie miał być w przeszłości dłuższy niż 100 lat.

myDate('2-1-00'); 
 

 
function myDate(date) { 
 
    let today = new Date(); 
 
    date = new Date(date.split('-').join('/')); 
 
    if ((today.getFullYear() - date.getFullYear()) >= 100) { 
 
    date.setFullYear(date.getFullYear() + 100); 
 
    } 
 
    alert(date); 
 
}

Powiązane problemy