Sé que esto me dará el día del mes como un número ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Pero ¿cómo se formatea el día del mes para incluir un indicador ordinal , por ejemplo 11th
, 21st
o 23rd
?
java
date
simpledateformat
ordinal
Ken Hume
fuente
fuente
SimpleDateFormat
clase. No solo está desactualizado desde hace mucho tiempo, sino que también es notoriamente problemático. Hoy tenemos mucho mejor enjava.time
la moderna API de fecha y hora de Java y susDateTimeFormatter
.Respuestas:
La tabla de @kaliatech es agradable, pero como se repite la misma información, abre la posibilidad de un error. Tal error realmente existe en la tabla para
7tn
,17tn
y27tn
(este error puede solucionarse a medida que pasa el tiempo debido a la naturaleza fluida de StackOverflow, así que verifique el historial de versiones en la respuesta para ver el error).fuente
No hay nada en JDK para hacer esto.
O usando el calendario:
Según los comentarios de @ thorbjørn-ravn-andersen, una tabla como esta puede ser útil al localizar:
fuente
fuente
java.lang.IllegalArgumentException
debido a "un carácter de patrón ilegal, t".La pregunta es un poco vieja. Como esta pregunta es muy ruidosa, publico lo que resolví con el método estático como una utilidad. ¡Solo cópialo, pégalo y úsalo!
Para probar purose
Ejemplo: ¡llamarlo desde el método principal!
Salida:
fuente
fuente
Me gustaría aportar la respuesta moderna. La
SimpleDateFormat
clase estaba bien cuando se hizo la pregunta hace 8 años, pero debe evitarla ahora, ya que no solo está desactualizada, sino que también es notoriamente problemática. Usar en sujava.time
lugar.Editar
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
Es genial para este propósito. Al usarlo, creamos un formateador que hace el trabajo por nosotros:El resultado de este fragmento es:
Vieja respuesta
Este código es más corto, pero en mi humilde opinión, no es tan elegante.
Ejecutando este fragmento justo ahora tengo
Una de las muchas características de
java.time
es que es sencillo y confiable obtener el día del mes comoint
, lo que obviamente es necesario para elegir el sufijo correcto de la tabla.Te recomiendo que escribas una prueba unitaria también.
PS Un formateador similar también se puede utilizar para analizar una cadena de fecha que contiene los números ordinales como
1st
,2nd
, etc, que se hizo en esta pregunta: Java - Analizar con fecha de segundos opcionales .Enlace: Tutorial de Oracle: Fecha Hora explicando cómo usar
java.time
.fuente
Si intenta conocer i18n, la solución se complica aún más.
El problema es que en otros idiomas el sufijo puede depender no solo del número en sí, sino también del nombre que cuenta. Por ejemplo, en ruso sería "2-ой день", pero "2-ая неделя" (significa "segundo día", pero "segunda semana"). Esto no se aplica si formateamos solo días, pero en un caso un poco más genérico, debe tener en cuenta la complejidad.
Creo que una buena solución (no tuve tiempo para implementar realmente) sería extender SimpleDateFormetter para aplicar MessageFormat Locale-aware antes de pasar a la clase padre. De esta forma, podría admitir, por ejemplo, los formatos de marzo% M para obtener "3-rd",% MM para obtener "03-rd" y% MMM para obtener "tercero". Desde fuera de esta clase se ve como SimpleDateFormatter normal, pero admite más formatos. Además, si este patrón fuera aplicado por error por SimpleDateFormetter regular, el resultado tendría un formato incorrecto, pero aún sería legible.
fuente
Muchos de los ejemplos aquí no funcionarán para 11, 12, 13. Esto es más genérico y funcionará para todos los casos.
fuente
No puedo estar satisfecho con las respuestas que piden una solución solo en inglés basada en formatos manuales. He estado buscando una solución adecuada por un tiempo y finalmente la encontré.
Debería estar utilizando RuleBasedNumberFormat . Funciona perfectamente y es respetuoso con la configuración regional.
fuente
Hay una manera más simple y segura de hacer esto. La función que necesitará usar es getDateFromDateString (dateString); Básicamente elimina el st / nd / rd / th de una cadena de fecha y simplemente lo analiza. Puede cambiar su SimpleDateFormat a cualquier cosa y esto funcionará.
}
fuente
El único problema con la solución provista por Greg es que no representa el número mayor que 100 con los números "adolescentes" que terminan. Por ejemplo, 111 debería ser 111, no 111. Esta es mi solución:
fuente
th
para 11, 12 y 13 como debería. Creo que elif ( hunRem - tenRem == 10 )
caso se asegura de que lo haga.RuleBasedNumberFormat
en la biblioteca de la UCIAprecié el enlace a la biblioteca del proyecto ICU de @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), sin embargo, aún tenía que calcular cómo usarlo, por lo que a continuación se muestra un ejemplo del
RuleBasedNumberFormat
uso.Solo formateará un número único en lugar de la fecha completa, por lo que deberá crear una cadena combinada si busca una fecha en formato: lunes 3 de febrero, por ejemplo.
El siguiente código configura el
RuleBasedNumberFormat
formato Ordinal para una configuración regional determinada, crea unjava.time ZonedDateTime
y luego formatea el número con su ordinal en una cadena.Salida de ejemplo:
O
etc.
fuente
Aquí hay un enfoque que actualiza un patrón DateTimeFormatter con el sufijo literal correcto si encuentra el patrón
d'00'
, por ejemplo, para el día del mes 1 se reemplazaría pord'st'
. Una vez que se ha actualizado el patrón, se puede alimentar al DateTimeFormatter para hacer el resto.Requiere que el patrón original se actualice justo antes de cada llamada de formateo, p. Ej.
Por lo tanto, esto es útil si el patrón de formato se define fuera del código Java, por ejemplo, una plantilla, donde como si pudiera definir el patrón en Java, entonces la respuesta de @ OleV.V. podría ser más apropiado
fuente
Me escribí un método de ayuda para obtener patrones para esto.
y luego podemos llamarlo como
la salida es
fuente
Pruebe a continuación la función:
fuente
Date
,Calendar
ySimpleDateFormat
. Esas clases están mal diseñadas y anticuadas, la última en particular notoriamente problemática. En su lugar, useLocalDate
yDateTimeFormatter
, ambos de java.time, la moderna API de fecha y hora de Java . También tengo dudas sobre qué novedades aporta tu respuesta en comparación con las otras 18 respuestas.En kotlin puedes usar así
establecido así
fuente
El siguiente método se puede usar para obtener la cadena formateada de la fecha que se le pasa. Formateará la fecha para decir primero, segundo, tercero, cuarto ... usando SimpleDateFormat en Java. por ejemplo: - 1 de septiembre de 2015
fuente
La siguiente es una respuesta más eficiente a la pregunta en lugar de codificar el estilo.
Para cambiar el día al número ordinal, debe usar el siguiente sufijo .
Encuentra mi respuesta completa en esta pregunta.
fuente
fuente