Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีแปลงสตริงวันที่เป็น Date Object ใน Java (Parse Date String)


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

วิธีที่ 1: ใช้ SimpleDateFormat (Legacy)

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sample {
    public static void main(String args[]) throws ParseException {
        String dateString = "2007-25-06";
        
        // กำหนดรูปแบบ: yyyy-dd-MM
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
        
        // Parse สตริงเป็น Date
        Date date = formatter.parse(dateString);
        System.out.println("Date value: " + date);
    }
}

ผลลัพธ์

Date value: Mon Jun 25 00:00:00 IST 2007

วิธีที่ 2: ใช้ LocalDate.parse() (Java 8+) - แนะนำ

LocalDate เป็น immutable, thread-safe และไม่มี time zone

import java.time.LocalDate;

public class Test {
    public static void main(String args[]) {
        // รูปแบบมาตรฐาน ISO (yyyy-MM-DD) ไม่ต้องระบุ formatter
        LocalDate date = LocalDate.parse("2007-12-03");
        System.out.println(date);
    }
}

ผลลัพธ์

2007-12-03

สำหรับรูปแบบอื่น ใช้ DateTimeFormatter:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Test {
    public static void main(String args[]) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        LocalDate date = LocalDate.parse("25-12-2020", formatter);
        System.out.println(date);  // 2020-12-25
    }
}

วิธีที่ 3: ใช้ Apache Commons DateUtils

ต้องเพิ่ม dependency:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
import java.util.Date;
import org.apache.commons.lang3.time.DateUtils;

public class Test {
    public static void main(String args[]) {
        String dateInString = "07-06-2013";
        // รูปแบบ: yyyy-MM-dd (แต่ตัวอย่างเดิมมี bug ใช้ผิดรูปแบบ)
        Date date = DateUtils.parseDate(dateInString, "dd-MM-yyyy");
        System.out.println(date);
    }
}

ผลลัพธ์

Fri Jun 07 00:00:00 IST 2013

วิธีที่ 4: ใช้ Instant.parse() (Java 8+)

สำหรับรูปแบบ ISO-8601 UTC (มี Z หรือ offset)

import java.time.Instant;

public class Test {
    public static void main(String args[]) {
        String dateInString = "2014-10-05T15:23:01Z";
        Instant instant = Instant.parse(dateInString);
        System.out.println(instant);
    }
}

ผลลัพธ์

2014-10-05T15:23:01Z

ตารางเปรียบเทียบ

วิธีเวอร์ชันรองรับ Time ZoneThread-Safeคำแนะนำ
SimpleDateFormat1.1+ใช่ไม่ (mutable)Legacy - หลีกเลี่ยง
LocalDate.parse()8+ไม่ (date only)ใช่ (immutable)แนะนำสำหรับวันที่อย่างเดียว
DateUtils.parseDate()1.5+ใช่ขึ้นอยู่กับการใช้งานถ้าใช้ Commons Lang อยู่แล้ว
Instant.parse()8+ใช่ (UTC)ใช่ (immutable)สำหรับ timestamp แบบ ISO-8601

Best Practice

  • ใช้ LocalDate สำหรับวันที่อย่างเดียว
  • ใช้ LocalDateTime สำหรับวันที่+เวลา (ไม่มี time zone)
  • ใช้ ZonedDateTime หรือ Instant สำหรับวันที่+เวลา+time zone
  • ระบุ DateTimeFormatter ให้ชัดเจนเสมอ สำหรับรูปแบบที่ไม่ใช่ ISO