มีหลายวิธีในการแปลง (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 Zone | Thread-Safe | คำแนะนำ |
|---|---|---|---|---|
| SimpleDateFormat | 1.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