Post Top Ad

Your Ad Spot

martes, 9 de julio de 2019

Cómo convertir una cadena a la fecha en Java

Convertir una cadena en una fecha en Java (o cualquier lenguaje de programación) es una habilidad fundamental y es útil saber cuando se trabaja en proyectos. A veces, es simplemente más fácil trabajar con una cadena para representar una fecha y luego convertirla en un Dateobjeto para su uso posterior.
En este artículo, repasaremos los muchos métodos y bibliotecas que puede usar para convertir una cadena Java en un objeto de fecha.

La fecha / hora API

La API de fecha y hora en Java funciona con el formato ISO 8601 por defecto, que es (yyyy-MM-dd).
Todas las fechas siguen este formato de forma predeterminada, y todas las cadenas que se convierten deben seguirlo si está utilizando el formateador predeterminado.

analizar gramaticalmente()

Esta API define un parse()método que acepta una secuencia de caracteres y utiliza el ISO_LOCAL_DATEformato para analizar la entrada:
parse(CharSequence);  
Alternativamente, puede usar la variante de dos argumentos de este método, definiendo un formateador diferente:
parse(CharSequence, DateTimeFormatter);  
DateTimeFormatterse utiliza para formatear y analizar objetos de fecha y hora en la nueva API de fecha / hora. Todas las clases de fecha y hora de esta API contienen un método para analizar y formatear, donde cada una acepta un DateTimeFormatter para definir un patrón.

Convertir una cadena a LocalDate

LocalDaterepresenta una fecha, sin hora, en formato ISO-8601.
Se diferencia del Datehecho de que no almacena el tiempo en milisegundos desde la época, sino simplemente la fecha actual. También es una implementación más reciente de la API Fecha / Hora y ofrece su propio método de formato / análisis, así como la suma y resta de días, semanas y años, que no existe en la variante Fecha.
Para convertir una cadena en un LocalDateobjeto, basta con escribir:
LocalDate date = LocalDate.parse("2018-09-16");  
Esto es equivalente a escribir el código de procedimiento para crear una instancia de un LocalDateobjeto:
LocalDate date = LocalDate.of(2018, 09, 16);  

Convertir una cadena a LocalTime

LocalTimerepresenta el tiempo, sin una zona horaria en formato ISO-8601. No almacena el tiempo en función del desplazamiento desde la época, y ofrece una precisión de nanosegundos .
Al igual que LocalDate, proporciona una gran cantidad de métodos de análisis y formato muy útiles incorporados, así como los medios para agregar o restar tiempo.
Para convertir una cadena en un LocalTimeobjeto, basta con escribir:
LocalTime localTime = LocalTime.parse("8:00");  
Esto es equivalente a escribir el código de procedimiento para crear una instancia de un LocalTimeobjeto:
LocalTime localTime = LocalTime.of(8, 00);  

Convertir una cadena a LocalDateTime

El LocalDateTimees la clase más utilizado en relación con la fecha / hora en Java. Representa una combinación de fecha y hora, y se puede utilizar para muchos propósitos:
LocalDateTime localDateTime = LocalDateTime.parse("2018-09-16T08:00:00");  
Este formato puede parecer confuso al principio, pero en realidad es bastante simple:
localdatetime
El marcador "Tiempo" simplemente representa una línea entre las partes LocalDateLocalTimeel formato.
También puede formatear fácilmente esto LocalDateTimeen un formato más legible:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
String formatDateTime = localDateTime.format(formatter);  
Ejecutar este código e imprimirlo formatDateTimedaría lugar a:
2018-09-16 08:00:00  
Normalmente, haría esto para mostrar el resultado al usuario final en formato de cadena, mientras realiza operaciones en el LocalDateTimeobjeto de antemano.

Convertir una cadena a ZonedDateTime

Dependiendo del proyecto en el que esté trabajando, es posible que deba manejar diferentes zonas horarias al tratar con fechas y horas.
Convertir una cadena en un ZonedDateTimeobjeto es tan simple como:
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-09-16T08:00:00+00:00[Europe/London]");  
El ejemplo anterior muestra cómo inicializaría una ZonedDateTimepara Londres.

Convertir una cadena usando un formateador personalizado

A veces, podríamos desear utilizar nuestro propio formateador personalizado, que acepta una cadena de las maneras más variadas y aún así no lanza una DateTimeParseException.
Estos son algunos de los patrones más comunes que utilizarías:
  • y: Año (2018, 18)
  • M: Mes en un año (agosto, agosto, 08)
  • d: Día en un mes (1, 5, 25)
  • E: Nombre de un día en una semana (lunes, sábado)
  • a: Ante meridiem / Post meridiem marcador (AM, PM)
  • H: Hora en estilo 24h (1, 7, 14, 21)
  • h: Hora en estilo 12h (1, 5, 12)
  • m: Minuto en una hora (1, 25, 54)
  • s: Segundo en un minuto (1, 25, 54)
Y algunos no podrías usar eso a menudo:
  • G: Designador de la era (AD, CE)
  • Y: Semana año (2018, 18)
  • w: Semana en un año (25, 53)
  • W: Semana en un mes (2)
  • D: Día en un año (254)
  • F: Día de la semana en un mes (3)
  • E: Nombre del día en una semana (lunes, lunes)
  • u: Día número de una semana (1, 4)
  • k: Hora en un día (17)
  • K: Hora en un día en AM / PM (5)
  • S: Milisegundo (1245)
  • z: Zona horaria general (Hora estándar del Pacífico; PST; GMT-8: 00)
  • Z: Zona horaria RFC 822 (-0800)
  • X: Zona horaria ISO 8601 (-08, -0800, -8: 00)
Nota: El año semanal difiere de un año: un año semanal está sincronizado con un WEEK_OF_YEARciclo. Todas las semanas entre la primera y la última semana (inclusive) tienen el mismo valor del año de la semana. Por lo tanto, los primeros y últimos días de un año de la semana pueden tener diferentes valores de año calendario.
Nota: K y Hdifieren de la misma manera khdifieren. Hhrefiérase a los modelos 0-23 y 1-12 respectivamente, mientras que Kkrefiérase a los modelos 0-11 y 1-24 respectivamente.
Si esto todavía no satisface su necesidad de un formateador personalizado, puede usar DateTimeFormatterBuilder para crear formateadores muy específicos y complejos. Entre otras cosas, DateTimeFormatter se crea utilizando esta clase.

java.util.Fecha

Este es un enfoque más antiguo, que no se usa a menudo hoy en día, pero aún así vale la pena cubrirlo, ya que a veces todavía usamos las clases de estas API:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");

Date date = formatter.parse("22-Sep-2018");  
Hay muchos patrones que podemos pasar al constructor SimpleDateFormatPuede combinar casi cualquier número de formatos utilizando los patrones disponibles.
No es posible establecer una zona horaria para una Fecha, porque simplemente no contiene dicha información. Sin embargo, es fácil formatear la fecha y agregar la información de la zona horaria a una Cadena:
SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");  
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = formatter.parse("22-09-2018 08:23:43 PM");  
String formattedDate = formatter.format(date);

System.out.println(date);  
System.out.println(formattedDate);  
Ejecutar este fragmento de código dará como resultado:
Sat Sep 22 22:23:43 CEST 2018  
22-9-2018 08:23:43 PM  
"22:23:43 CEST" corresponde a la hora "10:23:43 PM", mientras que la fecha formateada representa "8:23:43 PM" ya que está en una zona horaria diferente.

SimpleDateFormat vs DateTimeFormatter

Al leer este artículo, es justo plantear la pregunta: " ¿Cuál es la diferencia y cuál debería usar? "
DateTimeFormatterse ha agregado en Java 8 con la nueva API de fecha / hora y reemplaza a la antigua, que ahora se usa con menos frecuencia SimpleDateFormatEs seguro para subprocesos a diferencia de su contraparte anterior y ofrece una nueva funcionalidad:
// SimpleDateFormat
SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy");  
Date date = new Date();  
String formattedDate = formatter.format(date);  
Date parsedDate = formatter.parse(formattedDate);

// DateTimeFormatter
LocalDate date = LocalDate.now();  
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-M-yyyy");  
String formattedDate = date.format(formatter);  
LocalDate parsedDate = LocalDate.parse(formattedDate, formatter);  
Es claro ver la diferencia entre estos dos. En la forma anterior, se utiliza un formateador para formatear y luego analizar la fecha. En la forma más nueva, las fechas tienen su propio formato y métodos de análisis, y se utilizan DateTimeFormattersimplemente para el patrón.
Si está utilizando Java 8 y la nueva API, use DateTimeFormatter, mientras que si todavía está usando una versión anterior de Java, use SimpleDateFormat.

Tiempo de joda

Joda-Time fue desarrollado para contrarrestar los problemas con las antiguas clases de fecha y hora de Java.
A partir de Java 8, estos problemas se han corregido y Joda-Time ha cumplido su propósito. Incluso los autores de la misma aconsejan migrar a oficial java.timepara trabajar con fechas y horas.
En el caso de que esto sea imposible, y para aquellos que aún usan una versión de Java anterior a Java 8, Joda-Time sigue siendo una gran biblioteca para usar.
Una dependencia para esta biblioteca se puede agregar fácilmente con una dependencia de Maven :
<dependency>  
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>{version}</version>
</dependency>  
Trabajar con Joda-Time es muy similar a trabajar con la API de fecha y hora de Java:
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");

DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);  
La DateTimeclase de Joda-Time también soporta zonas horarias:
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");

DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);  
DateTime dateTimeZoned = dateTime.withZone(DateTimeZone.forID("Europe/London));  
Para obtener una lista completa de las identificaciones de zona horaria disponibles para su uso, visite los documentos oficiales .

Apache Commons

Apache Commons es una biblioteca útil utilizada en muchos proyectos.
Para agregar esta biblioteca a su proyecto, puede usar la dependencia de Maven:
<dependency>  
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>{version}</version>
</dependency>  
Las dos implementaciones siguientes aceptan una serie de patrones. Estos métodos analizarán cada patrón después de otro. Si ningún patrón coincide con la cadena de entrada, ParseExceptionse lanza una.

Utilizando DateTimeConverter

DateTimeConverter dtc = new DateConverter();  
dtc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd hh:mm:ss" });  
ConvertUtils.register(dtc, Date.class);  

Usando DateUtils

Date date = DateUtils.parseDate("22-Sep-2018", String[] {"dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy"});  

Conclusión

Hemos cubierto varias formas de convertir una cadena simple en clases de fecha y fecha y hora en Java. Algunos de estos enfoques utilizan bibliotecas de terceros que es posible que ya tenga en su proyecto, y algunos se realizan utilizando las API que ofrece Java.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas