Comment voulez vous mettre en forme le jour du mois pour dire “11”, “21” ou “23” (indicateur ordinal)?
Je sais que cela me donnera le jour du mois sous forme de nombre (11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Mais comment voulez-vous mettre en forme le jour du mois pour inclure une indicateur ordinal, dire 11th
, 21st
ou 23rd
?
- Pour référence, ils sont appelés des nombres ordinaux - en.wikipedia.org/wiki/Ordinal_number_(linguistique).
- Juste pour mémoire, quelque chose de la construction de la réponse au lieu de regarder la totalité de la réponse dans une table est presque impossible de les localiser dans d'autres langues.
- La réponse est d'une certaine manière incorrecte avoir un coup d'oeil à ma réponse plz.
- Moderne commentaire: je vous recommande d'éviter le
SimpleDateFormat
classe. Ce n'est pas seulement dépassée depuis longtemps, il est aussi notoirement difficile. Aujourd'hui, nous avons tellement mieux enjava.time
, le moderne Java date et l'heure de l'API et sonDateTimeFormatter
. - Jetez un oeil à l'un des numéros de l'API (math.outils/api/nombres). Il a un support pour ordinal, cardinal , le nombre énoncés dans une langue différente, énoncé comme monnaie, dans différentes langues, etc.
Vous devez vous connecter pour publier un commentaire.
La table de @kaliatech est gentil, mais depuis que la même information est répétée, elle ouvre la possibilité pour un bug. Un bogue existe réellement dans le tableau pour
7tn
,17tn
, et27tn
(ce bug pourrait se fixe comme le temps passe, en raison de la nature fluide de StackOverflow, afin de vérifier la version de l'histoire sur la réponse pour voir le message d'erreur).Preconditions.
Il n'y a rien dans le JDK pour ce faire.
Ou à l'aide d'un Calendrier:
Par les commentaires de @thorbjørn-ravn-andersen, un tableau comme celui qui peut être utile lors de la localisation:
Question est de petite vieille. Comme cette question est très bruyant donc de poster ce que j'ai résolu avec la méthode statique comme un util. Il suffit de copier, coller et l'utiliser!
Pour les tests purose
Exemple: appel de méthode main!
De sortie:
Si vous essayez d'être conscient de l'i18n la solution obtenir encore plus compliqué.
Le problème est que dans d'autres langues, le suffixe peut dépendre non seulement sur le nombre lui-même, mais aussi sur le nom qu'il compte. Par exemple en russe, il serait "2-ой день", mais "2-ая неделя" (il s'agit de signifier "2ème journée", mais "2ème semaine"). Ce n'est pas valable si le formatage jours seulement, mais en un peu plus de cas générique, vous devez être conscient de la complexité.
Je pense que la solution sympa (je n'ai pas eu le temps de réellement mettre en œuvre) serait d'étendre SimpleDateFormetter pour appliquer des paramètres Régionaux conscient MessageFormat avant de passer à la classe parent. De cette façon, vous serait en mesure de soutenir disons que pour le mois de Mars formats %M pour obtenir "3-rd", %MM pour obtenir "03-rd" et %MMM pour obtenir des "tiers". De l'extérieur de la classe ressemble régulière SimpleDateFormatter, mais prend en charge plusieurs formats. Aussi si ce modèle serait par erreur appliqué par la régularité de la SimpleDateFormetter le résultat serait mal mis en forme, mais encore lisible.
Je voudrais contribuer à la réponse moderne. Le
SimpleDateFormat
classe était OK à utiliser lorsque la question a été posée il y a 8 ans, mais vous devriez éviter d'elle maintenant qu'elle n'est pas seulement dépassée depuis longtemps, mais aussi notoirement difficile. Utilisationjava.time
à la place.Modifier
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
est idéal à cet effet. L'utiliser, nous avons développer un formateur qui fait le travail pour nous:La sortie de cet extrait est:
Vieille réponse
Ce code est plus court, mais à mon humble avis pas très élégante.
L'exécution de ce fragment de code, juste maintenant, je suis
L'une des nombreuses fonctionnalités de
java.time
est qu'il est simple et fiable pour obtenir la journée de mois, c'est unint
, ce qui est évidemment nécessaire pour choisir le bon suffixe de la table.Je vous recommande d'écrire un test unitaire trop.
PS similaire formateur peut également être utilisé pour analyse une date en chaîne de caractères contenant les nombres ordinaux comme
1st
,2nd
, etc. Cela a été fait dans cette question: Java - Parse date avec l'option secondes.Lien: Oracle tutoriel: Date Heure expliquant comment utiliser
java.time
.Les nombreux exemples présentés ici ne fonctionnera pas pour les 11, 12, 13. C'est plus générique et de travail pour tous les cas.
Je ne peux pas être satisfait par les réponses à l'appel pour un anglais seule solution basée sur le manuel de formats. J'ai été à la recherche d'une bonne solution pour un certain temps maintenant, et je l'ai finalement trouvé.
Vous devriez être en utilisant RuleBasedNumberFormat. Il fonctionne parfaitement et il est respectueux de l'endroit.
Il est simple et sûr moyen de le faire. La fonction que vous devez utiliser est getDateFromDateString(dateString); Il élimine en principe le st/nd/rd/th hors d'une chaîne de date et simplement l'analyse. Vous pouvez modifier votre SimpleDateFormat à rien et que cela fonctionne.
}
Seul problème avec la solution fournie par Greg, c'est qu'il ne compte pas le nombre de plus de 100 avec les "ados" des chiffres de la fin. Par exemple, 111 doit être 111e, pas 111st. C'est ma solution:
th
pour les 11, 12 et 13 comme il se doit. Je crois que leif ( hunRem - tenRem == 10 )
cas fait en sorte qu'il n'.Ici est une approche qui met à jour une DateTimeFormatter modèle avec le bon suffixe littérale si elle 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 donc être introduit dans le DateTimeFormatter pour faire le reste.Il ne nécessite que le modèle original est mis à jour juste avant chaque mise en forme d'appel, par exemple,
Si cela est utile si le format est défini en dehors du code Java, par exemple, un modèle, si vous pouvez définir le modèle en Java, alors la réponse par @OleV.V. peut-être plus approprié
J'ai écrit mon auto une méthode d'assistance pour obtenir des motifs pour cela.
et puis on peut l'appeler comme
la sortie est
Dans kotlin vous pouvez utiliser comme cette
définir comme ce
Si vous avez besoin de ce sur Android, vous pouvez consulter la cette réponse
C'est internationalisé solution. Et vous n'avez pas besoin de réinventer le vélo 😉
La méthode suivante peut être utilisée pour obtenir la chaîne mise en forme de la date qui est passé à elle. Il va le format de la date-à-dire le 1er,2ème,3ème,4ème .. à l'aide de SimpleDateFormat en Java. par exemple:- du 1er septembre 2015
Ce qui suit est une réponse plus efficace à la question plutôt que de coder en dur le style.
Pour changer le jour de nombre ordinal, vous devez utiliser les suffixe.
Trouver mes réponses complétée dans cette question.