Wiem, że to da mi dzień miesiąca jako liczba ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Ale w jaki sposób formatować dzień miesiąca w celu włączenia porządkowej wskaźnik , powiedzmy 11th
, 21st
lub 23rd
?
java
date
simpledateformat
ordinal
Ken Hume
źródło
źródło
SimpleDateFormat
zajęć. Jest nie tylko dawno przestarzały, ale także notorycznie kłopotliwy. Dziś mamy o wiele lepszejava.time
, nowoczesne API daty i czasu Java i jegoDateTimeFormatter
.Odpowiedzi:
Tabela z @kaliatech jest fajna, ale ponieważ ta sama informacja jest powtarzana, otwiera to szansę na błąd. Taki błąd faktycznie istnieje w tabeli dla
7tn
,17tn
i27tn
(ten błąd może zostać naprawiony w miarę upływu czasu ze względu na płynny charakter StackOverflow, więc sprawdź historię wersji odpowiedzi, aby zobaczyć błąd).źródło
W JDK nie ma nic, co mogłoby to zrobić.
Lub używając Kalendarza:
Zgodnie z komentarzem @ thorbjørn-ravn-andersen, taka tabela może być pomocna podczas lokalizacji:
źródło
źródło
java.lang.IllegalArgumentException
powodu „niedozwolonego wzoru, t”.Pytanie jest trochę stare. Ponieważ to pytanie jest bardzo głośne, opublikowanie tego, co zrobiłem, rozwiązało przy użyciu metody statycznej jako narzędzia. Po prostu skopiuj, wklej i używaj!
Do celów testowych
Przykład: wywołanie go z metody głównej!
Wynik:
źródło
źródło
Chciałbym przedstawić nowoczesną odpowiedź.
SimpleDateFormat
Klasy było OK do użycia, gdy pytano 8 lat temu, ale nie należy go teraz, ponieważ nie jest tylko długo nieaktualne, ale także notorycznie kłopotliwe. Użyjjava.time
zamiast tego.Edytować
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
świetnie nadaje się do tego celu. Korzystając z niego, budujemy formater, który wykonuje za nas pracę:Wynik tego fragmentu kodu to:
Stara odpowiedź
Ten kod jest krótszy, ale IMHO nie jest tak elegancki.
Uruchamiam ten fragment przed chwilą
Jedną z wielu cech
java.time
jest to, że można łatwo i niezawodnie uzyskać dzień miesiąca jako dzieńint
, co jest oczywiście potrzebne do wybrania odpowiedniego sufiksu z tabeli.Polecam również napisać test jednostkowy.
PS Podobny formater mogą być również wykorzystywane do analizowania ciąg datę zawierającą numery porządkowe jak
1st
,2nd
i inne, które zostało zrobione w tej kwestii: Java - datę Parse z opcjonalnymi sekund .Link: samouczek Oracle: Date Time wyjaśniający, jak używać
java.time
.źródło
Jeśli spróbujesz być świadomy i18n, rozwiązanie staje się jeszcze bardziej skomplikowane.
Problem w tym, że w innych językach przyrostek może zależeć nie tylko od samej liczby, ale także od rzeczownika, który się liczy. Na przykład w języku rosyjskim będzie to „2-ой день”, ale „2-ая неделя” (to znaczy „2. dzień”, ale „2. tydzień”). Nie ma to zastosowania, jeśli formatujemy tylko dni, ale w nieco bardziej ogólnym przypadku powinieneś być świadomy złożoności.
Myślę, że fajnym rozwiązaniem (nie miałem czasu na implementację) byłoby rozszerzenie SimpleDateFormetter, aby zastosować MessageFormat obsługujący locale przed przejściem do klasy nadrzędnej. W ten sposób możesz obsługiwać, powiedzmy, formaty% M w marcu, aby uzyskać „3-rd”,% MM, aby uzyskać „03-rd”, a% MMM, aby uzyskać „trzeci”. Z zewnątrz ta klasa wygląda jak zwykła SimpleDateFormatter, ale obsługuje więcej formatów. Również jeśli ten wzorzec zostałby przez pomyłkę zastosowany przez zwykłe SimpleDateFormetter, wynik byłby nieprawidłowo sformatowany, ale nadal czytelny.
źródło
Wiele z przedstawionych tutaj przykładów nie będzie działać dla 11, 12, 13. Jest to bardziej ogólne i będzie działać we wszystkich przypadkach.
źródło
Nie mogę być usatysfakcjonowany odpowiedziami wzywającymi do rozwiązania w języku angielskim opartego na ręcznych formatach. Od jakiegoś czasu szukałem odpowiedniego rozwiązania i w końcu go znalazłem.
Powinieneś używać RuleBasedNumberFormat . Działa doskonale i szanuje lokalizację.
źródło
Jest na to prostszy i pewniejszy sposób. Funkcja, której będziesz potrzebować, to getDateFromDateString (dateString); Zasadniczo usuwa st / nd / rd / th z łańcucha daty i po prostu go analizuje. Możesz zmienić SimpleDateFormat na cokolwiek i to zadziała.
}
źródło
Jedynym problemem z rozwiązaniem dostarczonym przez Grega jest to, że nie uwzględnia liczby większej niż 100 z końcówką „nastolatka”. Na przykład 111 powinno być 111, a nie 111. To jest moje rozwiązanie:
źródło
th
po 11, 12 i 13 tak, jak powinien. Uważam, żeif ( hunRem - tenRem == 10 )
sprawa zapewnia to.RuleBasedNumberFormat
w bibliotece ICUDoceniam link do biblioteki projektu ICU z @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), jednak nadal musiałem się zastanowić jak go używać, przykład
RuleBasedNumberFormat
użycia jest poniżej.Formatuje tylko pojedynczą liczbę, a nie całą datę, więc jeśli szukasz daty w formacie: na przykład poniedziałek 3 lutego, musisz utworzyć połączony ciąg.
Poniższy kod ustawia
RuleBasedNumberFormat
format porządkowy jako porządkowy dla danego ustawienia regionalnego, tworzy ajava.time ZonedDateTime
, a następnie formatuje liczbę wraz z jej liczbą porządkową w ciągu.Przykładowe dane wyjściowe:
Lub
itp.
źródło
Oto podejście, które aktualizuje wzorzec DateTimeFormatter poprawnym literałem sufiksu, jeśli znajdzie wzorzec
d'00'
, np. Dla dnia miesiąca 1 zostanie zastąpiony przezd'st'
. Po zaktualizowaniu wzorca można go po prostu wprowadzić do DateTimeFormatter, aby wykonać resztę.Wymaga to aktualizacji oryginalnego wzorca tuż przed każdym wywołaniem formatowania, np
Jest to więc przydatne, jeśli wzorzec formatowania jest zdefiniowany poza kodem Java, np. Szablonem, gdzie jakbyś mógł zdefiniować wzorzec w Javie, a następnie odpowiedź przez @ OleV.V. może być bardziej odpowiednie
źródło
Napisałem własną metodę pomocniczą, aby uzyskać wzorce do tego.
a potem możemy nazwać to jako
wyjście jest
źródło
Wypróbuj poniższą funkcję:
źródło
Date
,Calendar
aSimpleDateFormat
. Zajęcia te są źle zaprojektowane i dawno przestarzałe, a te ostatnie są szczególnie kłopotliwe. Zamiast tego użyjLocalDate
iDateTimeFormatter
, zarówno z java.time, nowoczesnego interfejsu API daty i czasu Java . Nie mam też wątpliwości, co nowego wnosi Twoja odpowiedź w porównaniu z pozostałymi 18 odpowiedziami?W kotlinie możesz używać w ten sposób
ustawić w ten sposób
źródło
Poniższa metoda może służyć do pobrania sformatowanego ciągu z datą, która jest do niego przekazywana. Data zostanie sformatowana jako pierwsza, druga, trzecia, czwarta ... przy użyciu SimpleDateFormat w Javie. np .: - 1 września 2015 r
źródło
Poniższa odpowiedź jest bardziej skuteczną odpowiedzią na pytanie niż zapisywanie stylu na stałe.
Aby zmienić dzień na liczbę porządkową, musisz użyć następującego przyrostka .
Znajdź moją pełną odpowiedź na to pytanie.
źródło
źródło