2009-12-09 4 views

Odpowiedz

26

Zamiast tego najlepiej użyć numeru Joda Time. Jest to nieskończenie lepszy interfejs API do wbudowanego. Jeśli chcesz, możesz wybrać między LocalDateTime i DateTime w zależności od Twoich konkretnych wymagań (to skomplikowany obszar - nie będę próbował podsumować w zdaniu lub dwóch, ale docs wykonać dobrą robotę).

Jeśli jest to absolutnie konieczne, użyj java.util.Calendar i przekonwertuj je na Date, kiedy zajdzie taka potrzeba.

+2

+1 dla Joda Time, to marzenie w porównaniu z datą i kalendarzem. –

+0

Mogło być świetnie, ale używam gxt (google toolkit i ext js), więc myślę, że muszę użyć obiektu daty z tym API. – Tim

+3

@Tim: To * zawsze * warto wspomnieć o niestandardowych środowiskach w pytaniu ... –

15

Jeśli spojrzysz na Javadoc, wskazuje to na użycie Calendar.

W JDK wersja 1.1 zastąpiono Calendar.set (+ 1900 roku, miesiąc daty, godziny, min), kalendarz gregoriański (lata + 1900, miesiąc, data godzin, min).

Jeśli spojrzeć na konstruktora Date params zobaczysz dlaczego została zaniechana:

Parametry:

year - the year minus 1900. 
month - the month between 0-11. 
date - the day of the month between 1-31. 
hrs - the hours between 0-23. 
min - the minutes between 0-59. 

year nie jest to, czego się spodziewać i nie jest month.

Do reprezentowania datę wspomniałem trzeba zadzwonić Date tak (nie zalecane)

new Date(2009-1900, 12-1, 9) 

Alternatywą korzystania Calendar jest

Calendar cal = Calendar.getInstance(); 
cal.set(2009, 11, 9); //year is as expected, month is zero based, date is as expected 
Date dt = cal.getTime(); 
+2

Miesiąc kalendarza nadal opiera się na zera. – BalusC

+0

faktycznie, miesiąc jest tym, czego oczekiwałbym. To data, która doprowadza mnie do szału. Wszystko w Javie opiera się na zerach, z wyjątkiem daty! – David

+0

@BlausC: Tak jest. Nic dziwnego, że ludzie wolą używać daty daty w formacie Joda zamiast tego biednego interfejsu Calendar API. – pjp

8

Można również użyć obiektu SimpleDateFormat:

import java.util.Date; 
import java.text.SimpleDateFormat; 
import java.text.ParseException; 


public class DateTest { 
    public static void main(String [] args) throws ParseException { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy, MM, dd"); 
     Date date = sdf.parse("2009, 12, 9"); 
     System.out.println(date); 
    } 
} 
+2

Po prostu uważaj, aby nie wprowadzać 'SimpleDateFormat' do' statycznej' instancji, ponieważ nie jest bezpieczna dla wątków. Zobacz http://www.ibm.com/developerworks/java/library/j-jtp09263.html – pjp

+0

: -o nie wiedziałem, że nie jest bezpieczny dla wątków. Na szczęście większość czasu, kiedy go użyłem (chociaż zadeklarowany jako członek klasy) znajdował się w bezpiecznym kontekście wątku :) – OscarRyz

2

Niestety data wsparcie w Java jest całkowicie okropne. Oficjalnie musisz to zrobić w Kalendarzu, ale moim zdaniem nie powinno to być konieczne. Jak wspomnieli inni, czas Joda jest o wiele lepszy, ale wciąż nie tak łatwy w użyciu jak daty w Ruby on Rails.

Nie jestem świadomy żadnego pakietu Javy, który daje taką ilość wsparcia dat (Joda wypada krótko, ale jest blisko), ale w Groovy użycie TimeCategory daje bardzo Ruby na obsługę dat w Railsach .

25

Calendar !

Calendar cal = Calendar.getInstance(); 
cal.set(2009, Calendar.DECEMBER, 12); 

Zauważ, że nie wprowadził w grudniu 12, bo to rzeczywiście 11 (styczeń jest 0).

Następnie, można dodać lub usunąć sekund, minut, godzin, dni, miesięcy lub lat z łatwością:

cal.add(Calendar.HOUR, 2); 
cal.add(Calendar.MONTH, -5); 

I wreszcie, jeśli chcesz Data:

cal.getTime(); 
+1

Twoje przykłady "dodaj" używają niewłaściwej kolejności parametrów, powinno to być cal.add (Calendar.HOUR, 2) –

+1

Należy pamiętać, że w przypadku tego rozwiązania godziny, minuty, sekundy (i ułamki) są ustawione na ich bieżącą wartość. To nie jest naprawdę czyste. – tos

4

Tim, w swoich komentarzach wspomniałeś, że robisz to w kontekście GXT - tj. w kodzie klienta GWT. GWT nie obsługuje kalendarza gregoriańskiego, a najprawdopodobniej nie będziesz w stanie umieścić JodaTime w GWTCompilatorze (możesz być w stanie, ale naprawdę chcesz).

Wydaje mi się, że naprawdę pozostało ci z opcją korzystania z JNSI, jeśli chcesz wykonywać operacje kalendarza w GWT. Zobacz klasę Data w JavaScript.