Rozpoczęło się to od prostego błędu: miałem YYYY
zamiast yyyy
w ciągu mojego formatu dla obiektu SimpleDateFormat
. Ale jestem całkowicie zaskoczony wynikami moich testów z niepoprawnym łańcuchem formatu.Jak działa "tydzień tygodnia" Java?
ten kod:
@Test
public void whatTheHell() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY");
Date d1 = sdf.parse("01/07/2016");
Date d2 = sdf.parse("02/08/2016");
Date d3 = sdf.parse("11/29/2027");
System.out.println(d1.toString());
System.out.println(d2.toString());
System.out.println(d3.toString());
} catch (ParseException pe) {
fail("ParseException: " + pe.getMessage());
}
}
produkuje ten wyjściowe:
Sun Dec 27 00:00:00 PST 2015
Sun Dec 27 00:00:00 PST 2015
Sun Dec 27 00:00:00 PST 2026
Czytałem dokumentację na parametrze 'Y' tutaj: https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html, ale ja nadal nie widzę logiki to działa tutaj. W szczególności ostatnia instancja: mogę trochę posortować, jak daty w styczniu (& może być w lutym) można przetłumaczyć na grudzień poprzedniego roku, ale przeniesienie daty 29 listopada wstecz o 11 miesięcy mnie zaskakuje. A co jest wyjątkowego w dniu 27 grudnia?
Czy ktoś może wyjaśnić?
WIĘCEJ INFORMACJI
@Jan zasugerował, że opierając się na metodzie toString() może być problem, więc zdefiniowany format daty, aby wydrukować YYYY MM dd '-' yyyy MM dd
w tym samym kodzie, jak powyżej. Oto dodatkowe wyjście:
2016 12 27 - 2015 12 27
2016 12 27 - 2015 12 27
2027 12 27 - 2026 12 27
powołując się na toString(), aby uczynić coś przydatny jest również optymistyczny. Możesz użyć innego DateFormat dla danych wyjściowych. Jak jeden obejmujący zarówno yyyy i YYYY? – Jan
Zobacz [tutaj] (http: // stackoverflow.com/questions/8686331/y-zwraca-2012-while-y-zwraca-2011-in-simpledateformat) dla wyjaśnienia roku VS tydzień roku – theo
@theo Dzięki, ale to wyjaśnia tylko zmiany, jeśli data jest pierwsza lub ostatnia Tydzień w roku, co jest możliwe tylko w przypadku pierwszego z moich trzech przykładów. –