ใช้ LocalDateTime ในการจัดการวันที่ที่เป็น String ในรูปแบบต่างๆ

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

วิธีนี้อาจดูเสียเวลา แต่ก็แก้ปัญหาความไม่เข้ากันได้ระดับหนึ่งเลย