Ich weiß , das wird mir den Tag des Monats als Zahl ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Aber wie formatieren Sie den Tag des Monats ein umfassen Ordinalzeichen , sagen wir 11th
, 21st
oder 23rd
?
java
date
simpledateformat
ordinal
Ken Hume
quelle
quelle
SimpleDateFormat
Klasse zu meiden . Es ist nicht nur lange veraltet, es ist auch notorisch problematisch. Heute haben wirjava.time
die moderne Java-API für Datum und Uhrzeit und ihreDateTimeFormatter
.Antworten:
Die Tabelle von @kaliatech ist nett, aber da die gleichen Informationen wiederholt werden, besteht die Möglichkeit eines Fehlers. Ein solcher Fehler ist tatsächlich in der Tabelle für
7tn
,17tn
und vorhanden27tn
(dieser Fehler kann im Laufe der Zeit aufgrund der fließenden Natur von StackOverflow behoben werden. Überprüfen Sie daher den Versionsverlauf in der Antwort , um den Fehler zu sehen).quelle
In JDK gibt es nichts, was dies tun könnte.
Oder mit Kalender:
Laut Kommentaren von @ thorbjørn-ravn-andersen kann eine Tabelle wie diese beim Lokalisieren hilfreich sein:
quelle
quelle
java.lang.IllegalArgumentException
wegen "eines illegalen Mustercharakters, t."Frage ist wenig alt. Da diese Frage sehr laut ist, poste ich, was ich mit der statischen Methode als Util gelöst habe. Einfach kopieren, einfügen und verwenden!
Zum Testen von Purose
Beispiel: Aufruf von der Hauptmethode!
Ausgabe:
quelle
quelle
Ich möchte die moderne Antwort beitragen. Die
SimpleDateFormat
Klasse konnte verwendet werden, als die Frage vor 8 Jahren gestellt wurde, aber Sie sollten sie jetzt vermeiden, da sie nicht nur längst veraltet, sondern auch notorisch problematisch ist. Verwenden Siejava.time
stattdessen.Bearbeiten
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
ist großartig für diesen Zweck. Damit erstellen wir einen Formatierer, der die Arbeit für uns erledigt:Die Ausgabe dieses Snippets lautet:
Alte Antwort
Dieser Code ist kürzer, aber meiner Meinung nach nicht so elegant.
Ich habe gerade dieses Snippet ausgeführt
Eines der vielen Merkmale von
java.time
ist, dass es einfach und zuverlässig ist, den Tag des Monats als zu erhaltenint
, was offensichtlich erforderlich ist, um das richtige Suffix aus der Tabelle auszuwählen.Ich empfehle Ihnen, auch einen Unit-Test zu schreiben.
PS Eine ähnliche Formatierer kann auch verwendet werden für das Parsen ein Datum String mit Ordnungszahlen wie
1st
,2nd
usw. Das in getan wurde diese Frage: Java - Parse Datum mit optionalen Sekunden .Link: Oracle-Tutorial: Datum Uhrzeit zur Erläuterung der Verwendung
java.time
.quelle
Wenn Sie versuchen, sich i18n bewusst zu werden, wird die Lösung noch komplizierter.
Das Problem ist, dass in anderen Sprachen das Suffix nicht nur von der Zahl selbst abhängt, sondern auch von dem Substantiv, das es zählt. Zum Beispiel auf Russisch wäre es "2-ой день", aber "2-ая неделя" (diese bedeuten "2. Tag", aber "2. Woche"). Dies gilt nicht, wenn wir nur Tage formatieren, aber in einem etwas allgemeineren Fall sollten Sie sich der Komplexität bewusst sein.
Ich denke, eine gute Lösung (ich hatte keine Zeit, sie tatsächlich zu implementieren) wäre, SimpleDateFormetter zu erweitern, um das länderspezifische MessageFormat anzuwenden, bevor es an die übergeordnete Klasse übergeben wird. Auf diese Weise können Sie beispielsweise die März-Formate% M unterstützen, um "3-rd" zu erhalten,% MM, um "03-rd" zu erhalten, und% MMM, um "3" zu erhalten. Von außerhalb sieht diese Klasse wie normaler SimpleDateFormatter aus, unterstützt jedoch mehr Formate. Auch wenn dieses Muster versehentlich vom regulären SimpleDateFormetter angewendet würde, wäre das Ergebnis falsch formatiert, aber dennoch lesbar.
quelle
Viele der Beispiele hier funktionieren nicht für 11, 12, 13. Dies ist allgemeiner und funktioniert für alle Fälle.
quelle
Ich kann mich nicht mit den Antworten zufrieden geben, die eine Lösung nur für Englisch erfordern, die auf manuellen Formaten basiert. Ich habe jetzt schon eine Weile nach einer richtigen Lösung gesucht und sie endlich gefunden.
Sie sollten RuleBasedNumberFormat verwenden . Es funktioniert perfekt und respektiert das Gebietsschema.
quelle
Es gibt einen einfacheren und sichereren Weg, dies zu tun. Die Funktion, die Sie verwenden müssen, ist getDateFromDateString (dateString). Grundsätzlich wird das st / nd / rd / th aus einer Datumszeichenfolge entfernt und einfach analysiert. Sie können Ihr SimpleDateFormat in alles ändern, und dies wird funktionieren.
}}
quelle
Das einzige Problem mit der von Greg bereitgestellten Lösung ist, dass sie keine Zahl größer als 100 berücksichtigt, wobei die "Teen" -Nummern enden. Zum Beispiel sollte 111 111 sein, nicht 111. Das ist meine Lösung:
quelle
th
für 11, 12 und 13 zurück, wie es sollte. Ich glaube, derif ( hunRem - tenRem == 10 )
Fall stellt sicher, dass es so ist.RuleBasedNumberFormat
in der IntensivbibliothekIch habe den Link zur Bibliothek des ICU-Projekts von @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ) sehr geschätzt , musste aber noch herausfinden Informationen zur Verwendung finden Sie weiter
RuleBasedNumberFormat
unten. Ein Beispiel für die Verwendung finden Sie weiter unten.Es wird nur eine einzelne Zahl und nicht das gesamte Datum formatiert. Sie müssen also eine kombinierte Zeichenfolge erstellen, wenn Sie nach einem Datum im Format suchen: beispielsweise Montag, 3. Februar.
Der folgende Code legt das
RuleBasedNumberFormat
Format als Ordnungszahl für ein bestimmtes Gebietsschema fest, erstellt einejava.time ZonedDateTime
und formatiert die Zahl mit ihrer Ordnungszahl in eine Zeichenfolge.Beispielausgabe:
Oder
etc.
quelle
Hier ist ein Ansatz, der ein DateTimeFormatter-Muster mit dem richtigen Suffix-Literal aktualisiert, wenn es das Muster findet
d'00'
, z. B. für den Tag des Monats 1, durch den es ersetzt wirdd'st'
. Sobald das Muster aktualisiert wurde, kann es einfach in den DateTimeFormatter eingegeben werden, um den Rest zu erledigen.Es ist erforderlich, dass das ursprüngliche Muster unmittelbar vor jedem Formatierungsaufruf aktualisiert wird, z
Dies ist also nützlich, wenn das Formatierungsmuster außerhalb von Java-Code definiert ist, z. B. einer Vorlage, bei der Sie das Muster in Java definieren können und dann die Antwort von @ OleV.V. könnte angemessener sein
quelle
Ich habe mir selbst eine Hilfsmethode geschrieben, um Muster dafür zu erhalten.
und dann können wir es als nennen
die Ausgabe ist
quelle
Versuchen Sie die folgende Funktion:
quelle
Date
,Calendar
undSimpleDateFormat
. Diese Klassen sind schlecht gestaltet und längst veraltet, wobei die letzten besonders notorisch problematisch sind. Verwenden Sie stattdessenLocalDate
undDateTimeFormatter
sowohl aus java.time als auch die moderne Java-API für Datum und Uhrzeit . Ich bin auch im Zweifel, was Ihre Antwort im Vergleich zu den anderen 18 Antworten neu beiträgt.In Kotlin können Sie so verwenden
so einstellen
quelle
Die folgende Methode kann verwendet werden, um die formatierte Zeichenfolge des Datums abzurufen, das an sie übergeben wird. Das Datum wird mit SimpleDateFormat in Java so formatiert, dass es 1., 2., 3., 4. ist. zB: - 1. September 2015
quelle
Das Folgende ist eine effizientere Antwort auf die Frage, als den Stil fest zu codieren.
Um den Tag in eine Ordnungszahl zu ändern, müssen Sie das folgende Suffix verwenden .
Finden Sie meine vollständige Antwort in dieser Frage.
quelle
quelle