Jak najlepiej przekonwertować plik String
w formacie „2 stycznia 2010 r.” Na Date
język Java?
Ostatecznie chcę wyróżnić miesiąc, dzień i rok jako liczby całkowite, aby móc z nich korzystać
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
przekonwertować datę na czas.
Date
są przestarzałe.java.util.Date
,java.util.Calendar
ijava.text.SimpleTextFormat
są teraz spuścizny , wyparta przez java.time klas. Zobacz samouczek Oracle .Odpowiedzi:
To trudna droga, a te
java.util.Date
metody ustawiające są przestarzałe od wersji Java 1.1 (1997). Po prostu sformatuj datę, używającSimpleDateFormat
wzorca formatu pasującego do ciągu wejściowego .W konkretnym przypadku „2 stycznia 2010 r.” Jako ciąg wejściowy:
MMMM
wzorcad
wzoru.yyyy
wzoru.Zwróć uwagę na znaczenie wyraźnego
Locale
argumentu. Jeśli go pominiesz, użyje domyślnych ustawień regionalnych, które niekoniecznie są angielskie, jak w nazwie miesiąca łańcucha wejściowego. Jeśli ustawienia narodowe nie pasują do ciągu wejściowego, to myląco można uzyskać,java.text.ParseException
nawet jeśli wzorzec formatu wydaje się prawidłowy.Oto wyciąg z javadoc , zawierający wszystkie dostępne wzorce formatów:
Zauważ, że we wzorach rozróżniana jest wielkość liter, a wzorce tekstowe składające się z czterech lub więcej znaków reprezentują pełną formę; w przeciwnym razie stosuje się krótką lub skróconą formę, jeśli jest dostępna. Więc np.
MMMMM
Więcej nie jest konieczne.Oto kilka przykładów prawidłowych
SimpleDateFormat
wzorców do parsowania danego ciągu do tej pory:Ważną uwagą jest to, że nie
SimpleDateFormat
jest bezpieczny dla wątków. Innymi słowy, nigdy nie powinieneś deklarować i przypisywać go jako zmiennej statycznej lub zmiennej instancji, a następnie ponownie użyć go z różnych metod / wątków. Zawsze powinieneś stworzyć go zupełnie nowy w ramach metody lokalnej.Aktualizacja Java 8
Jeśli akurat korzystasz z Javy 8 lub nowszej, użyj
DateTimeFormatter
(także tutaj, kliknij link, aby zobaczyć wszystkie predefiniowane formaterery i dostępne wzorce formatów; samouczek jest dostępny tutaj ). Ten nowy interfejs API jest inspirowany przez JodaTime .Uwaga: jeśli wzorzec formatu zawiera również część czasu, użyj
LocalDateTime#parse(text, formatter)
zamiast niejLocalDate#parse(text, formatter)
. A jeśli twój wzór formatu zawiera również strefę czasową, użyjZonedDateTime#parse(text, formatter)
zamiast tego.Oto wyciąg z javadoc , zawierający wszystkie dostępne wzorce formatów:
Pamiętaj, że ma kilka predefiniowanych formatów dla bardziej popularnych wzorów. Więc zamiast np.
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
Możesz użyćDateTimeFormatter.RFC_1123_DATE_TIME
. Jest to możliwe, ponieważ w przeciwieństwie do nich sąSimpleDateFormat
bezpieczne dla nici. W razie potrzeby możesz także zdefiniować własne.W przypadku określonego formatu ciągu wejściowego nie trzeba używać wyraźnego
DateTimeFormatter
: standardową datę ISO 8601 , taką jak 2016-09-26T17: 44: 57Z, można bezpośrednio przeanalizować,LocalDateTime#parse(text)
ponieważ już używaISO_LOCAL_DATE_TIME
formatyzatora. Podobnie,LocalDate#parse(text)
analizuje datę ISO bez komponentu czasu (patrzISO_LOCAL_DATE
) iZonedDateTime#parse(text)
analizuje datę ISO z dodanym przesunięciem i strefą czasową (patrzISO_ZONED_DATE_TIME
).źródło
O
, jak pozwolić drukowaćUTC+08:00
zamiastGMT+08:00
. Nie mogłem znaleźć żadnego przykładu.20-JUN-16 12.00.00.000000000 AM
, potrzebuję pomocy, aby przekonwertować to na datę. Twoja pomoc jest bardzo ceniona!!Ach tak, ponownie dyskusja na temat daty Java. Do radzenia sobie z manipulacją datami używamy Date , Calendar , GregorianCalendar i SimpleDateFormat . Na przykład używając daty stycznia jako danych wejściowych:
Następnie możesz nimi manipulować za pomocą czegoś takiego:
źródło
źródło
W Javie 8 otrzymujemy nowe API Data / Czas ( JSR 310 ).
Do parsowania daty w Javie 8 można użyć następującego sposobu, bez polegania na Joda-Time :
LocalDate to standardowa klasa Java 8 do reprezentowania daty (bez czasu). Jeśli chcesz przeanalizować wartości zawierające informacje o dacie i godzinie, powinieneś użyć LocalDateTime . Dla wartości ze strefami czasowymi użyj ZonedDateTime . Oba zapewniają
parse()
metodę podobną doLocalDate
:Znaki formatujące listę z DateTimeFormatter Javadoc :
źródło
Chociaż niektóre odpowiedzi są technicznie poprawne, nie są zalecane.
Ta popularna, bezpłatna biblioteka typu open source może być używana w kilku wersjach Javy. Wiele przykładów jego użycia można znaleźć na StackOverflow. Przeczytanie niektórych z nich pomoże ci szybko przyspieszyć.
Ten nowy zestaw klas został zainspirowany Joda-Time i zdefiniowany przez JSR 310. Klasy te są wbudowane w Javę 8. Trwa projekt przeniesienia tych klas do Javy 7, ale backporting nie jest wspierany przez Wyrocznia.
Data ma zarówno porcję daty, jak i porę dnia)
Początek dnia zależy od strefy czasowej. Jeśli nie określisz strefy czasowej, zastosowana zostanie domyślna strefa czasowa maszyny JVM. Oznacza to, że zachowanie kodu może ulec zmianie, gdy zostanie uruchomiony na innych komputerach lub ze zmodyfikowanym ustawieniem strefy czasowej. Prawdopodobnie nie to, czego chcesz.
regionalne Język ustawień regionalnych określa sposób interpretacji słów (nazwa miesiąca i dnia) napotkanych podczas analizy. ( Odpowiedź BalusC obsługuje to poprawnie.) Również ustawienia regionalne wpływają na dane wyjściowe niektórych formatów podczas generowania reprezentacji ciągu daty i godziny.
Joda-Time
Poniżej kilka uwag na temat Joda-Time.
Strefa czasowa
W Joda-Time , A DateTime obiekt naprawdę zna swój własny przypisany strefę czasową. Kontrastuje to z klasą java.util.Date, która wydaje się mieć strefę czasową, ale jej nie ma.
Zwróć uwagę w poniższym przykładowym kodzie, w jaki sposób przekazujemy obiekt strefy czasowej do formatyzatora, który analizuje ciąg. Ta strefa czasowa służy do interpretowania tej daty i godziny jako zdarzenia w tej strefie czasowej. Musisz więc przemyśleć i określić strefę czasową reprezentowaną przez ten ciąg znaków.
Ponieważ nie ma części czasu w ciągu wejściowym, Joda-Time przypisuje pierwszy moment dnia określonej strefy czasowej jako porę dnia. Zwykle oznacza to,
00:00:00
ale nie zawsze, ze względu na czas letni (DST) lub inne anomalie. Nawiasem mówiąc, możesz zrobić to samo z dowolną instancją DateTime, dzwoniącwithTimeAtStartOfDay
.Wzorzec formatyzatora
Znaki użyte we wzorcu formatera są podobne w Joda-Time do znaków w java.util.Date/Calendar, ale nie dokładnie takie same. Uważnie przeczytaj dokument.
Niezmienność
Zwykle używamy niezmiennych klas w Joda-Time. Zamiast modyfikować istniejący obiekt Date-Time, wywołujemy metody, które tworzą nową świeżą instancję w oparciu o inny obiekt z większością aspektów skopiowanych, z wyjątkiem przypadków, w których pożądane były zmiany. Przykładem jest połączenie z
withZone
ostatnią linią poniżej. Niezmienność pomaga uczynić Joda-Time bardzo bezpiecznym dla wątków, a także może uczynić niektóre prace bardziej przejrzystymi.Konwersja
Będziesz potrzebował obiektów java.util.Date do użytku z innymi klasami / frameworkiem, które nie wiedzą o obiektach Joda-Time. Na szczęście bardzo łatwo jest poruszać się w przód iw tył.
Przechodzenie z obiektu java.util.Date (tutaj o nazwie
date
) do Joda-Time DateTime…Idąc w innym kierunku od Joda-Time do obiektu java.util.Date…
Przykładowy kod
Po uruchomieniu…
źródło
Podczas pracy z klasą SimpleDateFormat należy pamiętać, że Date nie jest bezpieczny dla wątków i nie można współużytkować jednego obiektu Date z wieloma wątkami.
Istnieje również duża różnica między literami „m” i „M”, gdzie mała litera jest używana w minutach, a duża w przypadku miesiąca. To samo z „d” i „D”. Może to powodować subtelne błędy, które często są pomijane. Aby uzyskać więcej informacji, zobacz Javadoc lub Przewodnik po konwertowaniu ciągów na datę w Javie .
źródło
Działa dla mnie dobrze.
źródło
Możesz użyć SimpleDateformat, aby zmienić ciąg znaków do tej pory
źródło
Ponadto SimpleDateFormat nie jest dostępny w przypadku niektórych technologii po stronie klienta, takich jak GWT .
Dobrym pomysłem jest skorzystanie z Calendar.getInstance (), a twoim wymaganiem jest porównanie dwóch dat; iść na długą randkę.
źródło
Proste dwa formatowniki, których użyliśmy:
Analizujemy pełny format daty i godziny:
źródło
Mój skromny program testowy. Używam go do zabawy z formatyzatorem i wyszukiwania długich dat, które znajduję w plikach dziennika (ale kto je tam umieścił ...).
Mój program testowy:
Wyniki testów:
źródło
Link źródłowy
Dla systemu Android
Calendar.getInstance (). GetTime () daje
Posługiwać się
źródło
Konwersja ciągu na datę:
źródło
Spróbuj tego
źródło