import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.List;
public class FlexibleDateTimeParser {
// กำหนดรายการรูปแบบ (formats) ที่เป็นไปได้ทั้งหมด
private static final List<DateTimeFormatter> FORMATTERS = Arrays.asList(
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"), // รูปแบบ 1: 2025-10-01T10:01:11
DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"), // รูปแบบ 2: 01/10/2025 10:01:11
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm") // รูปแบบ 3: 2025/10/01 10:01
// ... เพิ่มรูปแบบอื่นๆ ที่คาดว่าจะเจอที่นี่ ...
);
/**
* พยายาม parse String เป็น LocalDateTime โดยใช้รูปแบบต่างๆ ที่กำหนดไว้
* * @param text String ของวันที่และเวลาที่ต้องการ parse
* @return LocalDateTime ที่ parse ได้ หากไม่สำเร็จจะ throw DateTimeParseException
*/
public static LocalDateTime parseFlexible(String text) {
// วนซ้ำ (loop) เพื่อลองใช้ DateTimeFormatter แต่ละตัว
for (DateTimeFormatter formatter : FORMATTERS) {
try {
// พยายามทำการ parse
return LocalDateTime.parse(text, formatter);
} catch (DateTimeParseException e) {
// หาก parse ไม่สำเร็จด้วยรูปแบบนี้ ให้ลองรูปแบบถัดไป (Do nothing / continue loop)
}
}
// หากวนลูปครบทุกรูปแบบแล้วยัง parse ไม่ได้ ให้ throw exception เพื่อแจ้งว่าไม่สามารถจัดการ input นี้ได้
throw new DateTimeParseException("Cannot parse date-time string: \"" + text + "\" using any known format.", text, 0);
}
public static void main(String[] args) {
// ตัวอย่าง input ที่มีรูปแบบต่างกัน
String input1 = "2025-10-01T10:01:11"; // ตรงกับรูปแบบ 1
String input2 = "05/12/2024 14:30:00"; // ตรงกับรูปแบบ 2
String input3 = "2023/11/20 09:00"; // ตรงกับรูปแบบ 3
String inputBad = "2025-15-01T10:01:11"; // input ผิดพลาด (เดือน 15)
System.out.println("--- ทดสอบการ Parse ที่สำเร็จ ---");
try {
LocalDateTime d1 = parseFlexible(input1);
System.out.println("Input 1: \"" + input1 + "\" -> " + d1);
LocalDateTime d2 = parseFlexible(input2);
System.out.println("Input 2: \"" + input2 + "\" -> " + d2);
LocalDateTime d3 = parseFlexible(input3);
System.out.println("Input 3: \"" + input3 + "\" -> " + d3);
} catch (DateTimeParseException e) {
System.err.println("Error during successful parse: " + e.getMessage());
}
System.out.println("\n--- ทดสอบการ Parse ที่ผิดพลาด ---");
try {
// โค้ดที่ผิดพลาดในคำถามต้นฉบับจะถูกตรวจพบในขั้นตอนนี้ (Invalid value for MonthOfYear: 15)
LocalDateTime dBad = parseFlexible(inputBad);
System.out.println("Input Bad: \"" + inputBad + "\" -> " + dBad); // โค้ดนี้จะไม่ถูกรัน
} catch (DateTimeParseException e) {
// จะจับ exception ที่ถูก throw ออกมาจาก parseFlexible
System.err.println("Error: " + e.getMessage());
}
}
}
การแปลงเป็น LocalDateTime มันดีกว่าใช้ String ตรงๆในการทำงาน คำนวณ หรือส่งไปให้ function อื่นๆอยู่แล้ว เพราะไม่ต้องสนใจว่าตอนนั้นเราเขียนให้มันใช้ format แบบไหน หรือเราจัดการ String วันที่ถูกต้องหรือไม่
วิธีนี้มันจะคอยวนลูป parse ไปเรื่อยๆ โดยจับ Exception ไว้ไม่ให้ลูปมันหยุด จนกว่าจะเจอ option ที่ตรงกัน
หลักๆมันก็มาจาก 2 บรรทัดนี้เท่านั้น เพียงแต่เพิ่มลูป support ให้ครบทุก format
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
LocalDateTime d = LocalDateTime.parse(jobRecordModel.getCreateDateTime(), formatter1);
วิธีนี้อาจดูเสียเวลา แต่ก็แก้ปัญหาความไม่เข้ากันได้ระดับหนึ่งเลย