คลาส java.text.SimpleDateFormat ใช้สำหรับ จัดรูปแบบ (Format) วันที่เป็นสตริง และ แปลง (Parse) สตริงเป็นวันที่
1. การ Parse สตริงเป็น Date
- สร้าง SimpleDateFormat ด้วย pattern string
- ใช้
parse(String)แปลงเป็น Date
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";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
Date date = formatter.parse(dateString);
System.out.println("Date value: " + date);
}
}
ผลลัพธ์
Date value: Mon Jun 25 00:00:00 IST 2007
2. การดึง Pattern String (toPattern)
เมธอด toPattern() คืนค่า pattern string ของ formatter ปัจจุบัน
import java.text.SimpleDateFormat;
public class Demo {
public static void main(String args[]) {
SimpleDateFormat obj = new SimpleDateFormat();
String pattern = obj.toPattern();
System.out.println(pattern); // Default pattern
}
}
ผลลัพธ์
M/d/yy h:mm a
3. การ Parse วันที่จากข้อความ (ParsePosition)
เมธอด parse(String, ParsePosition) แปลงวันที่จากตำแหน่งที่ระบุในข้อความ
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
String text = "Marriage date of Samrat is 2007-25-06";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
// เริ่ม parse จาก index 27
ParsePosition pos = new ParsePosition(27);
Date date = formatter.parse(text, pos);
System.out.println("Date value: " + date);
}
}
ผลลัพธ์
Date value: Mon Jun 25 00:00:00 IST 2007
⚠️ ข้อจำกัดสำคัญของ SimpleDateFormat
ไม่ใช่ Thread-Safe! SimpleDateFormat เป็น mutable stateful class การใช้ shared instance ใน multi-thread จะทำให้เกิดข้อมูลผิดพลาดหรือ Exception
แนวทางแก้ไข Thread-Safety
- สร้าง instance ใหม่ทุกครั้ง (อาจช้า)
- ใช้ ThreadLocal (แนะนำสำหรับ Legacy code)
- ย้ายไปใช้ DateTimeFormatter (Java 8+) - Immutable และ Thread-Safe ← Best Choice
การย้ายไป DateTimeFormatter (Java 8+)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
// Thread-safe, immutable
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-dd-MM");
LocalDate date = LocalDate.parse("2007-25-06", formatter);
String formatted = date.format(formatter);