如何在 Java 中禁用日期自动 update/correct/adjust?

How to disable date auto update/correct/adjust in Java?

我正在尝试检查日期的格式。

实施:获取日期格式 yyyy-MM-dd 然后如果我输入超过 12 个月和第 30 或 31 天取决于月份它必须显示错误。

如果我在字符串中手动设置日期,该模式将起作用,但日期必须来自日期到字符串,但日期会自动调整。

在此处尝试代码:https://www.programiz.com/java-programming/online-compiler/


    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeParseException;
    import java.time.temporal.TemporalAccessor;
    import java.util.Calendar;
    import java.util.Date;
    import java.time.Instant;
    import java.util.GregorianCalendar;
    import java.time.LocalDateTime;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    class HelloWorld {
        public static void main(String[] args) {
    
            Date date = new GregorianCalendar(2015, 11, 33).getTime();  
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        formatter.setLenient(false);
        String strDate = formatter.format(date); 
        
          
            
             Pattern dateFrmtPtrn =  Pattern.compile(
                        "((19|20)\d\d)"
                                + "-"
                        + "(0?[1-9]|1[012])"
                        + "-"
                        
                        +"(0?[1-9]|[12][0-9]|3[01])"
                        );
    Matcher mtch = dateFrmtPtrn.matcher(strDate);
            
            if(mtch.matches(
            )){
                
                System.out.println(strDate);
            }else{
                System.out.println("Error");
            }
          
        }
    }
    //Must Error
    //Output: 2016-01-02

只有字符串的手册。 这会起作用。


    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeParseException;
    import java.time.temporal.TemporalAccessor;
    import java.util.Calendar;
    import java.util.Date;
    import java.time.Instant;
    import java.util.GregorianCalendar;
    import java.time.LocalDateTime;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    class HelloWorld {
        public static void main(String[] args) {
    
        
        //  String datey = "2023-12-32";
          String datey = "2023-13-32";
            
             Pattern dateFrmtPtrn =  Pattern.compile(
                        "((19|20)\d\d)"
                                + "-"
                        + "(0?[1-9]|1[012])"
                        + "-"
                        
                        +"(0?[1-9]|[12][0-9]|3[01])"
                        );
    Matcher mtch = dateFrmtPtrn.matcher(datey);
            
            if(mtch.matches(
            )){
                
                System.out.println(datey);
            }else{
                System.out.println("Error");
            }
          
        }
    }
    
    //working
    //Output: Error

日历的默认行为是宽松的。

当您写 Date date = new GregorianCalendar(2015, 11, 33).getTime(); 时,您得到的是宽松日历的 Date 值,即 12 月 1 日之后的第 33 天。

在您的代码中,您将格式化程序设置为 lenient,这是无用的,因为您要格式化的日期已经调整。

为避免这种情况,请创建一个日历,设置它 non-lenient,然后设置预计日期。 但请注意,在这种情况下,格式化程序不会 return 任何无效日期,因为 Date 对象将始终有效。

如果您切换到 java.time.LocalDate,您可以使用当您尝试使用无效值初始化 LocalDate 时抛出的 Exception

假设您只想使用给定的 int 年、年月日值创建一个 LocalDate。您可以 try 初始化一个并打印 DateTimeException 抛出的错误消息。

例如以下代码将打印错误:

try {
    // try to create December 32. 2022
    LocalDate invLocDat = LocalDate.of(2022, 12, 32);
    System.out.println("Created LocalDate: " + invLocDat);
} catch (DateTimeException dte) {
    // print what the exception says
    System.err.println(dte.getMessage());
}

打印的消息将是

Invalid value for DayOfMonth (valid values 1 - 28/31): 32

您也可以找出无效的月份,例如LocalDate.of(2022, 13, 31) 会导致上面的代码打印

Invalid value for MonthOfYear (valid values 1 - 12): 13

并且有效的输入将简单地打印成功创建的 LocalDatetoString() 方法。如果您想要不同的输出,请使用 DateTimeFormatter