如何在 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
并且有效的输入将简单地打印成功创建的 LocalDate
的 toString()
方法。如果您想要不同的输出,请使用 DateTimeFormatter
。
我正在尝试检查日期的格式。
实施:获取日期格式 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
并且有效的输入将简单地打印成功创建的 LocalDate
的 toString()
方法。如果您想要不同的输出,请使用 DateTimeFormatter
。