Estoy tratando de convertir una String
a LocalDate
usando DateTimeFormatter
, pero recibo una excepción:
java.time.format.DateTimeParseException
: el texto ' 2021-10-31 ' no se pudo analizar en el índice 5
mi codigo es
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-uuuu"); String text = "2021-10-31"; LocalDate date = LocalDate.parse(text, formatter);
Estoy tratando de convertir de la fecha de entrada 2021-10-31
al 31-Oct-2021
.
¿Qué estoy haciendo mal en mi código?
Su código especifica el patrón dd-MMM-uuuu
, pero intenta analizar el texto 2021-10-31
que no se ajusta a este patrón en absoluto.
El patrón correcto para su cadena sería yyyy-MM-dd
. Consulte la documentación del formateador para obtener más información.
En particular, observe el orden de los días y meses dd-MMM
vs MM-dd
. Y la cantidad de meses MMM
. Una cadena que coincida con su patrón actual sería 31-Oct-2021
.
De los comentarios:
mi fecha de entrada es - 2021-10-31 necesita convertirse en - 31-oct-2021
Puede cambiar fácilmente el patrón de la fecha por:
yyyy-MM-dd
dd-MMM-yyyy
.En código, eso es:
DateTimeFormatter inputPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter outputPattern = DateTimeFormatter.ofPattern("dd-MMM-yyyy"); String input = "2021-10-31"; LocalDate date = LocalDate.parse(text, inputPattern); String output = date.format(outputPattern);
DateTimeFormatter
para analizar su cadena de entrada La API de fecha y hora moderna se basa en ISO 8601 y no requiere el uso de un objeto DateTimeFormatter
explícitamente siempre que la cadena de fecha y hora cumpla con los estándares ISO 8601. Tenga en cuenta que su cadena de fecha ya está en formato ISO 8601.
Necesita un DateTimeFormatter
solo para formatear el LocalDate
obtenido al analizar la cadena de entrada.
Manifestación:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.parse("2021-10-31"); System.out.println(date); DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("dd-MMM-uuuu", Locale.ENGLISH); System.out.println(date.format(dtfOutput)); } }
Producción:
2021-10-31 31-Oct-2021
Asegúrese de usar Locale
cuando use DateTimeFormatter
. Marque Nunca use SimpleDateFormat o DateTimeFormatter sin una configuración regional para obtener más información al respecto.
Obtenga más información sobre la API de fecha y hora moderna * de Trail: Date Time .
* Si está trabajando para un proyecto de Android y su nivel de API de Android aún no cumple con Java-8, verifique las API de Java 8+ disponibles a través de desugaring . Tenga en cuenta que Android 8.0 Oreo ya brinda soporte para java.time
. Consulte esta respuesta y esta respuesta para aprender a usar la API java.time
con JDBC.