Conversia șirului la data în Java

1. Prezentare generală

În acest tutorial, vom explora mai multe moduri de a converti obiectele String în obiecte Date . Vom începe cu noul API Data Time - java.time care a fost introdus în Java 8 înainte de a analiza vechiul tip de date java.util.Date utilizat și pentru reprezentarea datelor.

Pentru a termina, vom analiza și câteva biblioteci externe pentru conversie folosind Joda-Time și clasa Apache Commons Lang DateUtils .

2. Conversia șirului în LocalDate sau LocalDateTime

LocalDate și LocalDateTime sunt obiecte de dată și oră imuabile care reprezintă o dată și, în cele din urmă, o dată și o oră. În mod implicit, datele Java sunt în format ISO-8601, deci dacă avem un șir care reprezintă o dată și o oră în acest format, atunci putem folosi direct API-ul parse () al acestor clase .

Iată câteva detalii despre acest nou API.

2.1. Folosind API-ul Parse

API-ul Date-Time oferă metode parse () pentru analiza unui șir care conține informații despre dată și oră. Pentru a converti obiecte String în obiecte LocalDate și LocalDateTime , șirul trebuie să reprezinte o dată sau o oră valide conform ISO_LOCAL_DATE sau ISO_LOCAL_DATE_TIME.

În caz contrar, o DateTimeParseException va fi aruncată în timpul rulării.

În primul nostru exemplu, să convertim un șir într-un java.time . LocalDate :

LocalDate date = LocalDate.parse("2018-05-05");

O abordare similară cu cea de mai sus poate fi utilizată pentru a converti un șir într-un java.time . LocalDateTime :

LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");

Este important de remarcat faptul că atât LOCALDATE și LocalDateTime obiectele sunt agnostic de fus orar. Cu toate acestea, când trebuie să ne ocupăm de data și orele specifice fusului orar, putem folosi metoda de analiză ZonedDateTime direct pentru a obține o dată specifică fusului orar:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");

Acum să aruncăm o privire la modul în care convertim șirurile cu un format personalizat.

2.2. Utilizarea API-ului Parse cu un formatator personalizat

Conversia unui șir cu un format de dată personalizat într-un obiect Date este o operațiune răspândită în Java.

În acest scop, vom folosi clasa DateTimeFormatter care oferă numeroase formate predefinite și ne permite să definim un formatator.

Să începem cu un exemplu de utilizare a unuia dintre formatatorii predefiniți pentru DateTimeFormatter :

String dateInString = "19590709"; LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);

În exemplul următor, să creăm un formatator care aplică un format de „EEE, MMM aaaa”. Acest format specifică trei caractere pentru numele întregii zile a săptămânii, o cifră pentru a reprezenta ziua lunii, trei caractere pentru a reprezenta luna și patru cifre pentru a reprezenta anul.

Acest formatator recunoaște șiruri precum „ Vineri, 3 ianuarie 2003 ″ sau„ Miercuri, 23 martie 1994 “:

String dateInString = "Mon, 05 May 1980"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH); LocalDate dateTime = LocalDate.parse(dateInString, formatter);

2.3. Modele comune de dată și oră

Să analizăm câteva modele comune de dată și oră:

  • y - Anul (1996; 96)
  • M - Luna din an (iulie; iulie; 07)
  • d - Ziua din lună (1-31)
  • E - Numele zilei în săptămână (vineri, duminică)
  • a - Marcator am / pm (AM, PM)
  • H - Ora din zi (0-23)
  • h - Ora în orele am / pm (1-12)
  • m - Minut în oră (0-60)
  • s - Secunda în minut (0-60)

Pentru o listă completă de simboluri pe care le putem folosi pentru a specifica un model de analiză, faceți clic aici.

Dacă trebuie să convertim datele java.time în obiectul java.util.Date mai vechi , citiți acest articol pentru mai multe detalii.

3. Conversia șirului în java.util.Date

Înainte de Java 8, mecanismul de dată și oră Java era furnizat de vechile API-uri ale claselor java.util.Date , java.util.Calendar și java.util.TimeZone cu care uneori mai trebuie să lucrăm.

Să vedem cum să convertim un șir într-un obiect java.util.Date :

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); String dateInString = "7-Jun-2013"; Date date = formatter.parse(dateInString);

În exemplul de mai sus, trebuie mai întâi să construim un obiect SimpleDateFormat trecând modelul care descrie formatul datei și orei.

Apoi, trebuie să invocăm metoda parse () trecând data Șir . Dacă argumentul String transmis nu este în același format ca modelul, atunci va fi aruncată o ParseException .

3.1. Adăugarea informațiilor despre fusul orar la java.util.Date

Este important să rețineți că java.util.Date nu are niciun concept de fus orar și reprezintă doar numărul de secunde trecute de la ora Unix - 1970-01-01T00: 00: 00Z.

Dar, când imprimăm direct obiectul Date , acesta va fi întotdeauna tipărit cu fusul orar implicit al sistemului Java.

În acest ultim exemplu vom analiza modul de formatare a unei date, adăugând informații despre fusul orar:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("America/New_York")); String dateInString = "22-01-2015 10:15:55 AM"; Date date = formatter.parse(dateInString); String formattedDateString = formatter.format(date);

De asemenea, putem schimba programul fusului orar JVM, dar acest lucru nu este recomandat:

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

4. Biblioteci externe

Acum, că avem o bună înțelegere a modului de a converti obiectele String în obiecte Date folosind noile și vechile API-uri oferite de Java de bază, să aruncăm o privire asupra unor biblioteci externe.

4.1. Biblioteca Joda-Time

An alternative to the core Java Date and Time library is Joda-Time. Although the authors now recommend users to migrate to java.time (JSR-310) if this isn't possible then the Joda-Time library provides an excellent alternative for working with Date and Time. This library provides pretty much all capabilities supported in the Java 8 Date Time project.

The artifact can be found on Maven Central:

 joda-time joda-time 2.10 

Here’s a quick example working with the standard DateTime:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter);

Let's also see an example of explicitly setting a time zone:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter); DateTime dateTimeWithZone = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata"));

4.2. Apache Commons Lang – DateUtils

DateUtils Clasa oferă multe utilități utile , ceea ce face mai ușor să lucreze cu moștenirea calendar și Data obiectelor .

Artefactul commons-lang3 este disponibil de la Maven Central:

 org.apache.commons commons-lang3 3.7 

Să convertim un șir de date folosind o matrice de modele de date într-un java.util.Date :

String dateInString = "07/06-2013"; Date date = DateUtils.parseDate(dateInString, new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });

5. Concluzie

În acest articol, am ilustrat mai multe moduri de a converti șirurile de caractere în diferite tipuri de obiecte Date (cu și fără timp), atât în ​​Java simplă, cât și folosind biblioteci externe.

Codul sursă complet al articolului este disponibil pe GitHub.