2009-09-23 12 views
16

Chcę zapisać obiekt Date na czytelnym łańcuchu znaków (na przykład 22/10/2009 21:13:14), który jest również możliwy do odtworzenia z powrotem do obiektu Date.Czytelny dla człowieka i możliwy do formatowania format daty w Javie

Próbowałem wielu rzeczy, a najlepsze, jakie mogłem znaleźć, było użycie DateFormater do analizowania i formatowania, ale ma on pewien minus. Podczas formatowania daty tracisz informacje o sekundach. Próbowałem znaleźć, czy istnieje opcja sformatowania go i wyświetlenia sekund (nawet lepiej byłoby do poziomu milisekund, ponieważ jest to rozdzielczość, którą obiekt Date pozwala), ale doszedłem do tego.

Wszelkie pomysły?

Odpowiedz

37

Spójrz na java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS"); 
Date dt = new Date(); 
String S = sdf.format(dt); // formats to 09/23/2009 13:53:28.238 
Date dt2 = sdf.parse(S); // parses back 
+0

Kiedy ta odpowiedź została napisana w 2009 roku "SimpleDateFormat" było tym, co mieliśmy w tym celu. Okazało się to kłopotliwe i na szczęście zostało zastąpione przez 'java.time', nowoczesny interfejs API Data i czas Java oraz jego klasę' DateTimeFormatter' w 2014 roku. Polecam, abyś nigdy więcej nie używał 'SimpleDateFormat'. –

4

SimpleDateFormat można formatować i analizować datę w oparciu o bardzo prosty system wzorców, które obejmują drugi i nawet milisekund.

+1

@Unihedron Zaktualizowano link. Recenzenci, proszę zauważyć, że to NIE jest odpowiedź typu link-only - odpowiedź nadal ma znaczenie bez linku, a sam link do oficjalnej dokumentacji. –

2

Trochę nie na temat, ale zawsze czuję potrzebę przypominania ludziom, że DateFormat i SimpleDateFormat nie są bezpieczne dla wątków! Dokumentacja Sun wyraźnie to stwierdza, ale wciąż znajduję kod w środowisku naturalnym, gdzie ludzie przyklejają SimpleDateFormat w statycznym ...

+0

Dlatego wszyscy powinni zamiast tego używać czasu Jody i oszczędzać sobie bólów głowy :) – Nick

+0

Całkowicie się zgadzam. Z drugiej strony chcę, żeby Sun naprawił te klasy, więc jeśli nic więcej, nie muszę siedzieć przez kolejne "zdobyte lekcje współbieżności" - z ludźmi, którzy mnie o tym ostrzegają. (Och, ironia ... Właśnie zrobiłem dokładnie to samo tutaj na StackOverflow :-)) –

4

Inne odpowiedzi są dobre.

Ale kiedy robi tego typu rzeczy proszę wybrać format, który sortuje poprawnie gdy zakodowany jako ciąg .... "YYYY/MM/DD hh: mm: ss" jest w porządku. Zawsze mnie zadziwia, gdy inżynierowie oprogramowania wybierają format daty, który nie sortuje w oczywisty i wygodny sposób.

Zaoszczędzisz twoi koledzy deweloperzy dużo bólu w jakimś odległym punkcie w przyszłości - myśleć o nim jako dobrą karmę :-)

+0

"yyyy/dd/MM" nie sortuje poprawnie. Należy wziąć pod uwagę, że 2015/21/10, 2015/20/11 i 2015/22/11 zostały posortowane jako ciągi w 2015/20/11, 2015/21/10, 2015/22/11. –

+2

Przepraszamy, miałem na myśli rrrr/MM/dd. Naprawiony. – mikera

1

ISO 8601

Korzystanie formacie ISO 8601.

  • Jest elastyczny, zawiera sekund, a ułamek sekundy, jeśli istnieją, ale można też zostawić je, jeśli są one 0.
  • To jest standard, więc coraz więcej narzędzi format i analizować je. Doskonały do ​​serializacji do przechowywania lub wymiany danych.
  • To jest jak 2009-10-22T21:13:14, powinienem powiedzieć, że jest całkiem czytelny dla człowieka (chociaż T w środku, który oznacza początek czasu, część może się wydawać niezwykła na początku).
  • Struny sortowania prawidłowo, zgodnie z wnioskiem w another answer, mikera dopóki roku mieszczą się w przedziale czterocyfrowy od 1000 do 9999.
  • Klasy java.time Nowoczesny data i czas Java API, a także Joda Time analizuje ISO 8601 jako domyślny, czyli bez żadnego jawnego formatera, i produkuje ten sam format z ich metod toString.

Skromny pokaz używając java.time:

LocalDateTime dateTime = LocalDateTime.of(2009, 10, 22, 21, 13, 14); 
String readableString = dateTime.toString(); 
System.out.println(readableString); 
LocalDateTime parsedBack = LocalDateTime.parse(readableString); 
System.out.println(parsedBack); 

Drukuje dwa identyczne wiersze:

2009-10-22T21:13:14 
2009-10-22T21:13:14 

Ten ostatni System.out.println() wezwanie niejawnie nazywa toString() jeszcze raz, więc nie powinno być zaskoczeniem.

0

Jeśli chcesz zrobić to trochę prostsze i być oszczędzone od tworzenia własnego dateformat że większość innych odpowiedzi zaangażowania, można wykorzystać domyślny format w java.time.Instant:

(new Date()).toInstant.toString(); 
Powiązane problemy