roznica pomiedzy Calendar i Date

0

jak w temacie-czy ktos z Was moglby mi wyjasnic jaka jest miedzy nimi tak na prawde roznica? w obu przeciez definiujemy daty. Szukalam na google ale nie znalazlam satysfakcjonujacej odpowiedzi. a tak sobie pomyslalam ze w sumie uzywalam i jednej i drugiej, ale tak na prawde to nie wiem jaka jest miedzy nimi roznica i ktorej lepiej uzyc w konkretnym przypadku.

   pzdr,
      misty
0

Date to prosta klasa ktora przetrzymuje tylko czas (milis od epoch). Kiedys nie bylo Calendar, i ta klasa miala metody aby dokonywac manipulacji / arytketyki z datami (jak dodanie 5 dni, odjecie miesiaca, itp), od czasu Calendar te metody sa @Deprecated.
Calendar to 'nowy' sposob, ktory ma dosc potezne metody do arytmetyki, wspiera lokalizacje (np miesiaca po polsku). Calendar to klasa bazowa, abstrakcyjna, ktora teoretycznie moze byc rozszerzana przez inne klasy. I tak np mamy GregorianCalendar, ale mozemy niby miec buddyjski, koptyjski itp itd. W praktyce w tej klasie jest za duzo kodu ktory zaklada podzial dat w sposob podobny do gregorianskiego / julianskiego, przez co implementacja innych jest nieco utrudniona, czasami wrecz niemozliwa. Nie pomaga tez fakt ze jest to klasa, a nie interfejs - nie mozna po prostu zrobic swojej wlasnej implementacji.

Osobiscie jak tylko moge unikam obu klas - Calendar wg mnie jest strasznie nieprzejrzysty, magiczny wrecz - nie wiadomo nigdy kiedy nastapi rekalkulacja wewnetrznej daty - wywolujesz metody i one nic nie robia, po czym wolasz klejna i dopiero ona dokonuje obliczen, przez co mialem kiedystam problem. Moze sie cos zmienilo. Ja uzywam jak tylko moge klas z biblioteki JodaTima - dosc duze, czasami skomplikowane API, ale tak naprawde trzeba poznac pare klas i po prostu dziala. Z Date / Calendar mialem mnostwo problemow gdy zapisywalem date do bazy w jednej strefie czasowej, odczytywalem w innej, i jakos to nie dzialalo - a nie jest to jakis szczegolny przypadek, ot chociazby zmiany czasu dwukrotnie na rok potrafia troche nabrudzic. Wydaje sie ze 2 dni to malo, i to tylko przez godzine, ale sprobuj takich argumentow z: szefem banku dla ktorego robisz soft, operatorem komorkowym. Przyklad: zmieniamy czas z 2 na 3 w nocy, koles dzwoni komorka od 1:59 przez 2 minuty, ale nagle jest 3:01 w systemie, i operator kasuje go za 1h:02m. To nie sa latwe problemy, a java.util.Date i Calendar tylko to utrudniaja. Dodatkowo, obie klasy sa mutable, a klasy w JodaTime nie. Jak mozesz to daj sobie z nimi spokoj (moja osobista rada, moze inni lubia i chwala sobie te klasy?).

Powiedziawszy to, JodaTime ma tez swoje problemy, dlatego czekam na http://jcp.org/en/jsr/detail?id=310, pisanego przez tworce Jody i majacego te slabosci wyeliminowac. Zdaje sie w Java 7.

0

dzieki za odpowiedz.
piszesz ze:
Date / Calendar mialem mnostwo problemow gdy zapisywalem date do bazy w jednej strefie czasowej, odczytywalem w innej, i jakos to nie dzialalo - a nie jest to jakis szczegolny przypadek, ot chociazby zmiany czasu dwukrotnie na rok potrafia troche nabrudzic...

Pociagne temat tak by wiedziec na przyszlosc. Jak to jest wlasnie z tymi datami w roznych strefach czasowych? Wiem ze moge sobie pobrac wszystkie dostepne strefy czasowe. ale czy moge programowo sprawdzic w jakiej aktualnie jestem? Jesli tak-to czy nie wystarczy taka ustawic? Pytam-bo nie wiem. dziwi mnie to ze jest taki problem z Date i Calendar w tej kwestii. Zaciekawiles mnie i poczytam sobie w tym temacie. i dzieki za linka, juz kiedys slyszalam o tym ale nigdy nie korzystalam ani nawet sobie nie przyblizylam.

pzdr

0

TimeZone.getDefault
TimeZone.setDefault

Mozna pobrac i ustawic, wez jednak pod uwage srodowiska gdzie taka operacja jest niedozwolona (ustawia strefe dla calej JVM, a co gdy jestes w jednej z kilku aplikacji na serwerze aplikacji Java EE), niepoprawna (ustawia dla jednej JVM, a co gdy jestes aktualnie tylko na jednym kompie w klastrze). Ogolnie takie rozwiazanei jest bardzo slabe.
Joda robi to tak, ze zapisuje 2 kolumny (na przykladzie mapowania dla Hibernate): millis oraz nazwe strefy. Przy wczytywaniu takiej daty tworzona jest instancja zdaje sie DateTime, ktora oblicza millis za pomoca zapisanej strefy, czyli zawsze dostaniesz to samo co zapisalas. Gdy zapisujesz Date / Calendar, zapisuje sie jedna kolumna, i przy wczytaniu w innej strefie mozesz dostac inne wyniki - duzo zalezy od typu kolumny (np timestamp vs timestamp with time zone wg standardu SQL).
Dodatkowo Joda zawiera bardzo duzo ciekawych klas, jak np Interval, Duration itp, dzieki ktorym mozesz w latwy sposb np otrzymac ze 3:01 - 1:59 w dniu zmiany czasu jest 2 minuty, a nie 1h 2 min - podczas takich dzialan strefy sa brane pod uwage automatycznie. Konwersja miedzy czasami lokalnymi (bez stref) a globalnymi (ze strefami), normalizacja itp to bulka z maslem.
Z Date / Calendar mozna sie zejechac, a przynajmniej takie sa moje wrazenia.

0

dzieki.
przyblize sobie te tematyke bo predzej czy pozniej na pewno sie z tym spotkam.

     pzdr,
          misty

1 użytkowników online, w tym zalogowanych: 0, gości: 1