แปลง String เป็น Date ใน Java

1. ภาพรวม

ในการกวดวิชานี้เราจะสำรวจหลายวิธีที่จะแปลงStringวัตถุลงในวันที่วัตถุ เราจะเริ่มด้วยDate Time API ใหม่ - java.timeที่เปิดตัวใน Java 8 ก่อนที่จะดูประเภทข้อมูลjava.util.Date แบบเก่าที่ใช้สำหรับแสดงวันที่

ในการเสร็จสิ้นเราจะดูไลบรารีภายนอกบางส่วนสำหรับการแปลงโดยใช้ Joda-Time และคลาสApache Commons Lang DateUtils

2. การแปลงStringเป็นLocalDateหรือLocalDateTime

LocalDateและLocalDateTimeเป็นอ็อบเจ็กต์วันที่และเวลาที่ไม่เปลี่ยนรูปซึ่งแสดงถึงวันที่และต่อมาคือวันที่และเวลา โดยค่าเริ่มต้นวันที่ Java อยู่ในรูปแบบ ISO-8601 ดังนั้นหากเรามีสตริงใด ๆ ซึ่งหมายถึงวันที่และเวลาในรูปแบบนี้แล้วเราสามารถใช้ในการแยกวิเคราะห์ () API ของชั้นเรียนเหล่านี้ได้โดยตรง

นี่คือรายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับ API ใหม่นี้

2.1. ใช้Parse API

เขา Date-Time API มีวิธีการparse ()สำหรับการแยกวิเคราะห์Stringที่มีข้อมูลวันที่และเวลา การแปลง String วัตถุLOCALDATE และ LocalDateTimeวัตถุที่Stringต้องแสดงถึงวันที่ถูกต้องหรือเวลาตาม ISO_LOCAL_DATE หรือ ISO_LOCAL_DATE_TIME

มิฉะนั้นDateTimeParseExceptionจะถูกโยนไปที่รันไทม์

ในตัวอย่างแรกของเราขอแปลงStringไปjava.time LocalDate :

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

วิธีการคล้ายกับข้างต้นสามารถนำมาใช้ในการแปลงStringไปjava.time LocalDateTime :

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

มันเป็นสิ่งสำคัญที่จะต้องทราบว่าทั้งLOCALDATEและLocalDateTimeวัตถุเขตเวลาไม่เชื่อเรื่องพระเจ้า อย่างไรก็ตามเมื่อเราจำเป็นต้องจัดการกับวันที่และเวลาที่ระบุโซนเวลาเราสามารถใช้วิธีการแยกวิเคราะห์ZonedDateTimeได้โดยตรงเพื่อรับวันเวลาที่ระบุโซนเวลา

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

ตอนนี้เรามาดูวิธีที่เราแปลงสตริงด้วยรูปแบบที่กำหนดเอง

2.2. การใช้Parse API กับ Custom Formatter

การแปลงสตริงด้วยรูปแบบวันที่แบบกำหนดเองเป็นอ็อบเจ็กต์Dateเป็นการดำเนินการที่แพร่หลายใน Java

เพื่อจุดประสงค์นี้เราจะใช้คลาสDateTimeFormatterซึ่งมีรูปแบบที่กำหนดไว้ล่วงหน้าจำนวนมากและช่วยให้เรากำหนดฟอร์แมตเตอร์ได้

เริ่มจากตัวอย่างการใช้หนึ่งในรูปแบบที่กำหนดไว้ล่วงหน้าของDateTimeFormatter :

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

ในตัวอย่างถัดไปให้สร้างฟอร์แมตเตอร์ที่ใช้รูปแบบของ“ EEE, MMM d yyyy” รูปแบบนี้ระบุอักขระสามตัวสำหรับชื่อวันเต็มของสัปดาห์โดยหนึ่งหลักใช้แทนวันของเดือนอักขระสามตัวเพื่อแทนเดือนและสี่หลักเพื่อแสดงปี

ฟอร์แมตเตอร์นี้รู้จักสตริงเช่น“ ศ. 3 ม.ค. 2546″ หรือ“ พ. 23 มี.ค. 2537 ”:

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

2.3. รูปแบบวันที่และเวลาทั่วไป

ลองดูรูปแบบวันที่และเวลาทั่วไป:

  • y -ปี (2539; 96)
  • M -เดือนในปี (กรกฎาคม; ก.ค. 07)
  • d - วันในเดือน (1-31)
  • E - ชื่อวันในสัปดาห์ (วันศุกร์วันอาทิตย์)
  • a -เครื่องหมาย Am / pm (AM, PM)
  • H - ชั่วโมงในวัน (0-23)
  • h - ชั่วโมงใน am / pm (1-12)
  • m - นาทีในชั่วโมง (0-60)
  • วินาที - วินาทีในนาที (0-60)

สำหรับรายการสัญลักษณ์ทั้งหมดที่เราสามารถใช้เพื่อระบุรูปแบบในการแยกวิเคราะห์คลิกที่นี่

หากเราต้องการแปลงวันที่java.timeเป็นวัตถุjava.util.Date ที่เก่ากว่าโปรดอ่านบทความนี้สำหรับรายละเอียดเพิ่มเติม

3. การแปลงStringเป็นjava.util.Date

ก่อน Java 8 กลไกวันที่และเวลาของ Java ถูกจัดเตรียมโดย API เก่าของjava.util.Date , java.util.Calendarและคลาสjava.util.TimeZoneซึ่งบางครั้งเราก็ยังต้องใช้

มาดูวิธีการแปลง String เป็นวัตถุjava.util.Date :

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

ในตัวอย่างข้างต้นเราต้องสร้างออบเจ็กต์SimpleDateFormat ก่อนโดยส่งรูปแบบที่อธิบายรูปแบบวันที่และเวลา

ต่อไปเราจะต้องเรียกแจง ()วิธีผ่านวันสตริง หากอาร์กิวเมนต์String ที่ส่งผ่านไม่อยู่ในรูปแบบเดียวกับรูปแบบParseExceptionจะถูกโยนทิ้ง

3.1. การเพิ่มข้อมูลโซนเวลาในjava.util.Date

สิ่งสำคัญคือต้องทราบว่าjava.util.Dateไม่มีแนวคิดเรื่องเขตเวลาและแสดงเฉพาะจำนวนวินาทีที่ผ่านไปนับตั้งแต่ยุค Unix - 1970-01-01T00: 00: 00Z

But, when we print the Date object directly, it will always be printed with the Java default system time zone.

In this final example we'll look at how to format a date, adding time zone information:

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

We can also change the JVM time zone programmatically, but this isn't recommended:

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

4. External Libraries

Now that we have a good understanding of how to convert String objects to Date objects using the new and old APIs offered by core Java let's take a look at some external libraries.

4.1. Joda-Time Library

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ระดับให้หลายสาธารณูปโภคที่มีประโยชน์ทำให้ง่ายต่อการทำงานร่วมกับมรดกปฏิทินและวันที่วัตถุ

สิ่งประดิษฐ์ commons-lang3 มีให้จาก Maven Central:

 org.apache.commons commons-lang3 3.7 

ลองแปลงสตริงวันที่โดยใช้อาร์เรย์ของรูปแบบวันที่เป็น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. สรุป

ในบทความนี้เราได้อธิบายวิธีการแปลงสตริงเป็นอ็อบเจ็กต์Dateประเภทต่างๆ(มีและไม่มีเวลา) หลายวิธีทั้งใน Java ธรรมดาและการใช้ไลบรารีภายนอก

ซอร์สโค้ดฉบับเต็มของบทความมีอยู่ใน GitHub