Tukar Rentetan ke Tarikh di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka beberapa cara untuk menukar objek String menjadi objek Date . Kita akan mulakan dengan API Date Time baru - java.time yang diperkenalkan di Java 8 sebelum melihat jenis data java.util.Date yang lama juga digunakan untuk mewakili tarikh.

Untuk menyelesaikannya, kami juga akan melihat beberapa perpustakaan luaran untuk penukaran menggunakan kelas Joda-Time dan Apache Commons Lang DateUtils .

2. Menukar String ke LocalDate atau LocalDateTime

LocalDate dan LocalDateTime adalah objek tarikh-waktu yang tidak berubah yang mewakili tarikh dan terakhir tarikh dan waktu. Secara lalai, tarikh Java dalam format ISO-8601, jadi jika kita mempunyai rentetan yang mewakili tarikh dan waktu dalam format ini, maka kita dapat menggunakan API parse () kelas ini secara langsung .

Inilah sedikit lebih terperinci mengenai API baru ini.

2.1. Menggunakan Parse API

T dia API Date-Time menyediakan kaedah parse () untuk menguraikan String yang mengandungi maklumat tarikh dan waktu. Untuk menukar objek String ke objek LocalDate dan LocalDateTime , String mesti menunjukkan tarikh atau masa yang sah mengikut ISO_LOCAL_DATE atau ISO_LOCAL_DATE_TIME.

Jika tidak, DateTimeParseException akan dilemparkan pada waktu runtime.

Dalam contoh pertama kami, mari ubah String menjadi java.time . Tarikh Tempatan :

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

Pendekatan serupa dengan perkara di atas boleh digunakan untuk menukar String menjadi java.time . Waktu Tempatan Tempatan :

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

Adalah penting untuk ambil perhatian bahawa kedua-dua LOCALDATE dan LocalDateTime objek zon waktu agnostik. Walau bagaimanapun, apabila kita perlu menangani tarikh dan waktu tertentu zon waktu, kita boleh menggunakan kaedah mengurai ZonedDateTime secara langsung untuk mendapatkan waktu tarikh tertentu zon waktu:

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

Sekarang mari kita lihat bagaimana kita menukar rentetan dengan format tersuai.

2.2. Menggunakan Parse API dengan Custom Formatter

Menukar String dengan format tarikh khusus menjadi objek Date adalah operasi yang meluas di Java.

Untuk tujuan ini, kami akan menggunakan kelas DateTimeFormatter yang menyediakan banyak format format yang telah ditentukan, dan membolehkan kami menentukan formatter.

Mari kita mulakan dengan contoh menggunakan salah satu format format DateTimeFormatter yang telah ditentukan :

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

Dalam contoh seterusnya, mari buat formatter yang menggunakan format "EEE, MMM dyyyy". Format ini menentukan tiga aksara untuk nama hari penuh dalam seminggu, satu digit untuk mewakili hari dalam bulan, tiga aksara untuk mewakili bulan dan empat digit untuk mewakili tahun.

Penyusun ini mengenali rentetan seperti " Jum, 3 Jan 2003" atau "Rab, 23 Mar 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. Corak Tarikh dan Masa Biasa

Mari lihat beberapa corak tarikh dan masa yang biasa:

  • y - Tahun (1996; 96)
  • M - Bulan dalam tahun (Julai; Jul; 07)
  • d - Hari dalam bulan (1-31)
  • E - Nama hari dalam minggu (Jumaat, Ahad)
  • a - Penanda am / pm (AM, PM)
  • H - Jam dalam hari (0-23)
  • h - Jam dalam am / pm (1-12)
  • m - Minit dalam jam (0-60)
  • s - Kedua dalam minit (0-60)

Untuk senarai penuh simbol yang boleh kita gunakan untuk menentukan corak penghuraian klik di sini.

Sekiranya kita perlu menukar tarikh java.time menjadi objek java.util.Date yang lebih lama , baca artikel ini untuk maklumat lebih lanjut.

3. Menukar String ke java.util.Date

Sebelum Java 8, mekanisme tarikh dan waktu Java disediakan oleh API lama java.util.Date , java.util.Calendar , dan java.util.TimeZone kelas yang kadang-kadang kita masih perlu bekerjasama.

Mari lihat bagaimana menukar String menjadi objek java.util.Date :

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

Dalam contoh di atas, pertama kita perlu membina objek SimpleDateFormat dengan melewati corak yang menerangkan format tarikh dan waktu.

Seterusnya, kita perlu menggunakan kaedah parse () melewati String tarikh . Sekiranya argumen String yang dilalui tidak dalam format yang sama dengan corak maka ParseException akan dilemparkan.

3.1. Menambah Maklumat Zon Waktu ke java.util.Date

Penting untuk diingat bahawa java.util.Date tidak mempunyai konsep zon waktu , dan hanya mewakili bilangan saat yang berlalu sejak zaman Unix - 1970-01-01T00: 00: 00Z.

Tetapi, apabila kita mencetak objek Date secara langsung, objek tersebut akan selalu dicetak dengan zon waktu sistem lalai Java.

Dalam contoh akhir ini kita akan melihat cara memformat tarikh, menambahkan maklumat zon waktu:

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);

Kami juga boleh mengubah zon waktu JVM secara program, tetapi ini tidak digalakkan:

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

4. Perpustakaan Luar

Sekarang kita mempunyai pemahaman yang baik tentang cara menukar objek String ke objek Date menggunakan API baru dan lama yang ditawarkan oleh Java inti, mari kita lihat beberapa perpustakaan luaran.

4.1. Perpustakaan 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

The DateUtils kelas menyediakan banyak utiliti berguna menjadikannya lebih mudah untuk bekerja dengan warisan Kalendar dan Tarikh objek .

Artefak commons-lang3 boleh didapati dari Maven Central:

 org.apache.commons commons-lang3 3.7 

Mari ubah String tarikh menggunakan Array corak tarikh menjadi java.util. Tarikh :

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

5. Kesimpulan

Dalam artikel ini, kami menggambarkan beberapa cara untuk menukar String ke berbagai jenis objek Date (dengan dan tanpa waktu), baik di Java biasa maupun menggunakan perpustakaan luaran.

Kod sumber penuh artikel boleh didapati di GitHub.