Jestem nowy w Javie, zwykle pracuję z PHP.
Próbuję przekonwertować ten ciąg:
Poniedziałek, 14 marca, 16:02:37 GMT 2011
Do obiektu kalendarza, dzięki czemu mogę łatwo pobrać rok i miesiąc w następujący sposób:
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
Czy byłoby złym pomysłem przeanalizowanie go ręcznie? Używasz metody podciągów?
Każda rada pomoże, dzięki!
Odpowiedzi:
Uwaga: ustaw
Locale
zgodnie ze środowiskiem / wymaganiamiZobacz też
źródło
java.time
. To pytanie / odpowiedź jest dość widoczne w Google.tl; dr
Nowoczesne podejście wykorzystuje klasy java.time .
Unikaj starszych klas daty i godziny
Współczesnym sposobem są klasy java.time. Stare klasy data-czas, takie jak
Calendar
, okazały się źle zaprojektowane, zagmatwane i kłopotliwe.Zdefiniuj niestandardowy program formatujący, aby dopasować dane wejściowe ciągu.
Analizuj jako plik
ZonedDateTime
.Interesuje Cię rok i miesiąc. W tym celu klasy java.time zawierają
YearMonth
klasy.W razie potrzeby możesz zapytać o numer roku i miesiąca.
Ale
toString
metoda generuje ciąg w standardowym formacie ISO 8601 .Połącz to wszystko razem.
Zrzuć na konsolę.
Kod na żywo
Zobacz ten kod działający w IdeOne.com .
Konwersja
Jeśli musisz mieć
Calendar
obiekt, możesz przekonwertować go na aGregorianCalendar
przy użyciu nowych metod dodanych do starych klas.Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do java.time.
Aby dowiedzieć się więcej, zobacz samouczek Oracle . Wyszukaj wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Skąd wziąć klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Cóż, myślę, że byłoby złym pomysłem replikowanie kodu, który jest już obecny w klasach takich jak
SimpleDateFormat
.Z drugiej strony, osobiście sugerowałbym unikanie
Calendar
iDate
całkowicie, jeśli możesz, i używanie zamiast tego Joda Time , jako znacznie lepiej zaprojektowanego API daty i czasu. Na przykład musisz mieć świadomość, że nieSimpleDateFormat
jest to bezpieczne dla wątków, więc za każdym razem potrzebujesz lokalnych ustawień wątku, synchronizacji lub nowego wystąpienia. Parsery i elementy formatujące Joda są bezpieczne dla wątków.źródło
java.time
jest droga, Basil Bourque udzielił doskonałej odpowiedzi.Nie trzeba tworzyć nowego kalendarza, SimpleDateFormat używa już kalendarza pod spodem.
(Jeszcze nie mogę komentować, dlatego utworzyłem nową odpowiedź)
źródło
SimpleDateFormat
jest świetny, pamiętaj tylko, żeHH
różni się odhh
pracy z godzinami.HH
zwróci 24-godzinne godziny, a hh zwróci 12-godzinne godziny.Na przykład poniższe zwróci 12-godzinny czas:
Chociaż to zwróci 24-godzinny czas:
źródło
Przeanalizuj czas ze
Z
strefą czasową, we wzorcu dotyczy strefy czasowejWyjście: zwraca czas UTC
Jeśli nie ustawimy strefy czasowej według wzoru
yyyy-MM-dd'T'HH:mm:ss
.SimpleDateFormat
użyje ustawionej strefy czasowejSetting
źródło
Tak, samodzielne analizowanie tego byłoby złą praktyką. Spójrz na SimpleDateFormat , zamieni ciąg znaków w datę i możesz ustawić datę w instancji kalendarza.
źródło
Prosta metoda:
źródło