Je sais que cela va me donner le jour du mois en nombre ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Mais comment formatez-vous le jour du mois pour inclure un indicateur ordinal , disons 11th
, 21st
ou 23rd
?
java
date
simpledateformat
ordinal
Ken Hume
la source
la source
SimpleDateFormat
cours. Il n'est pas seulement obsolète depuis longtemps, il est également notoirement gênant. Aujourd'hui, nous avons tellement mieux dansjava.time
l'API de date et d'heure Java moderne et sesDateTimeFormatter
.Réponses:
Le tableau de @kaliatech est sympa, mais comme les mêmes informations sont répétées, cela ouvre la possibilité d'un bug. Un tel bug existe réellement dans la table
7tn
,17tn
et27tn
(ce bug pourrait se fixe au fil du temps en raison de la nature fluide de StackOverflow, de vérifier l'historique de version sur la réponse pour voir l'erreur).la source
Il n'y a rien dans JDK pour faire cela.
Ou en utilisant le calendrier:
Selon les commentaires de @ thorbjørn-ravn-andersen, un tableau comme celui-ci peut être utile lors de la localisation:
la source
la source
java.lang.IllegalArgumentException
cause d'un "caractère de motif illégal, t."La question est un peu vieille. Comme cette question est très bruyante, poster ce que j'ai fait résolu avec la méthode statique en tant qu'utilitaire. Copiez, collez et utilisez-le!
Pour tester purose
Exemple: l'appel à partir de la méthode main!
Production:
la source
la source
Je voudrais apporter la réponse moderne. La
SimpleDateFormat
classe était acceptable lorsque la question a été posée il y a 8 ans, mais vous devriez l'éviter maintenant car elle est non seulement obsolète depuis longtemps, mais aussi notoirement gênante. Utilisezjava.time
plutôt.Éditer
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
est parfait à cet effet. En l'utilisant, nous construisons un formateur qui fait le travail pour nous:Le résultat de cet extrait de code est:
Ancienne réponse
Ce code est plus court, mais à mon humble avis, pas si élégant.
J'exécute cet extrait juste maintenant
L'une des nombreuses caractéristiques de
java.time
est qu'il est simple et fiable d'obtenir le jour du mois sous forme deint
, ce qui est évidemment nécessaire pour choisir le bon suffixe dans le tableau.Je vous recommande également d'écrire un test unitaire.
PS Un formatter similaire peut également être utilisé pour l' analyse d' une chaîne de date contenant des nombres ordinaux comme
1st
,2nd
, etc. Cela a été fait dans cette question: Java - Date Parse avec secondes en option .Lien: tutoriel Oracle: date et heure expliquant comment utiliser
java.time
.la source
Si vous essayez de connaître i18n, la solution devient encore plus compliquée.
Le problème est que dans d'autres langues, le suffixe peut dépendre non seulement du nombre lui-même, mais aussi du nom qu'il compte. Par exemple, en russe, ce serait "2-ой день", mais "2-ая неделя" (cela signifie "2ème jour", mais "2ème semaine"). Cela ne s'applique pas si nous ne formalisons que des jours, mais dans un cas un peu plus générique, vous devez être conscient de la complexité.
Je pense qu'une bonne solution (je n'ai pas eu le temps de mettre en œuvre réellement) serait d'étendre SimpleDateFormetter pour appliquer MessageFormat tenant compte des paramètres régionaux avant de passer à la classe parente. De cette façon, vous seriez en mesure de prendre en charge les formats de mars% M pour obtenir "3-rd",% MM pour obtenir "03-rd" et% MMM pour obtenir "troisième". De l'extérieur, cette classe ressemble à SimpleDateFormatter ordinaire, mais prend en charge plus de formats. De plus, si ce modèle était appliqué par erreur par SimpleDateFormetter ordinaire, le résultat serait incorrectement formaté, mais toujours lisible.
la source
La plupart des exemples ici ne fonctionneront pas pour 11, 12, 13. C'est plus générique et fonctionnera pour tous les cas.
la source
Je ne peux pas être satisfait des réponses appelant à une solution uniquement en anglais basée sur des formats manuels. Je cherchais une solution appropriée depuis un moment maintenant et je l'ai finalement trouvée.
Vous devez utiliser RuleBasedNumberFormat . Cela fonctionne parfaitement et c'est respectueux de la locale.
la source
Il existe un moyen plus simple et sûr de le faire. La fonction que vous devrez utiliser est getDateFromDateString (dateString); Il supprime fondamentalement le st / nd / rd / th d'une chaîne de date et l'analyse simplement. Vous pouvez changer votre SimpleDateFormat en n'importe quoi et cela fonctionnera.
}
la source
Le seul problème avec la solution fournie par Greg est qu'elle ne tient pas compte du nombre supérieur à 100 avec les nombres «adolescents» se terminant. Par exemple, 111 devrait être 111e, pas 111e. Voici ma solution:
la source
th
pour 11, 12 et 13 comme il se doit. Je crois que l'if ( hunRem - tenRem == 10 )
affaire garantit que c'est le cas.RuleBasedNumberFormat
dans la bibliothèque ICUJ'ai apprécié le lien vers la bibliothèque du projet ICU de @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), mais il fallait encore figurer comment l'utiliser, donc un exemple d'
RuleBasedNumberFormat
utilisation est ci-dessous.Il ne formatera qu'un seul nombre plutôt que la date entière, vous devrez donc créer une chaîne combinée si vous recherchez une date au format: lundi 3 février, par exemple.
Le code ci-dessous définit le en
RuleBasedNumberFormat
tant que format ordinal pour un paramètre régional donné, crée unjava.time ZonedDateTime
, puis met en forme le nombre avec son ordinal dans une chaîne.Exemple de sortie:
Ou
etc.
la source
Voici une approche qui met à jour un modèle DateTimeFormatter avec le suffixe littéral correct s'il trouve le modèle
d'00'
, par exemple pour le jour du mois 1, il serait remplacé pard'st'
. Une fois que le modèle a été mis à jour, il peut simplement être introduit dans DateTimeFormatter pour faire le reste.Cela nécessite que le modèle d'origine soit mis à jour juste avant chaque appel de formatage, par exemple
Cela est donc utile si le modèle de formatage est défini en dehors du code Java, par exemple un modèle, où comme si vous pouviez définir le modèle en Java, la réponse par @ OleV.V. pourrait être plus approprié
la source
J'ai écrit moi-même une méthode d'aide pour obtenir des modèles pour cela.
et alors nous pouvons l'appeler comme
la sortie est
la source
Essayez la fonction ci-dessous:
la source
Date
,Calendar
etSimpleDateFormat
. Ces classes sont mal conçues et dépassées depuis longtemps, la dernière en particulier étant notoirement gênante. Utilisez plutôtLocalDate
etDateTimeFormatter
, tous deux de java.time, l'API de date et d'heure Java moderne . Je doute également de la nouveauté de votre réponse par rapport aux 18 autres réponses?Dans kotlin, vous pouvez utiliser comme ça
réglé comme ça
la source
La méthode suivante peut être utilisée pour obtenir la chaîne formatée de la date qui lui est transmise. Il formatera la date pour dire 1er, 2ème, 3ème, 4ème .. en utilisant SimpleDateFormat en Java. ex: - 1er septembre 2015
la source
Ce qui suit est une réponse plus efficace à la question plutôt que de coder en dur le style.
Pour changer le jour en nombre ordinal, vous devez utiliser le suffixe suivant .
Trouvez ma réponse complète dans cette question.
la source
la source