一个非常愉快的早晨,我只有一个查询,下面是执行年份的程序。让我们说日期作为输入是03/20/2020
然后是执行日期,程序变为03/08/2021
这是完全错误的。随着年份的增加,完整的日期是错误的。
请告知我如何更正我的程序以达到相同的日期。
public class DateFormattingTest {
private static final SimpleDateFormat outputDate = new SimpleDateFormat(
"dd/MM/yyyy");
public static void main(String[] args) {
System.out.println ("03/20/2020:" + extractDate("03/20/2020") );
DateFormattingTest test = new DateFormattingTest();
convertDate(test, "03/20/2020");
}
public static Date extractDate(String dateStr) {
String [] datePatterns = {"yyyy-MM-dd", "dd-MM-yyyy","MM/dd/yyyy" };
Date date = null;
try {
date = DateUtils.parseDate(dateStr, datePatterns);
}
catch (Exception except) {
except.printStackTrace();
}
return date;
}
private static void convertDate(DateFormattingTest test, String dateString) {
java.util.Date date = test.convertStringToDate(dateString);
System.out.println(dateString + " -> " + outputDate.format(date));
}
public java.util.Date convertStringToDate(String stringValue) {
String[] formatStrings = { "dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy" };
for (String formatString : formatStrings) {
try {
java.util.Date date = new SimpleDateFormat(formatString)
.parse(stringValue);
return date;
} catch (ParseException e) {
}
}
return null;
}
}
答案 0 :(得分:2)
您的原始String
日期似乎采用MM/dd/yyyy
格式,extractDate
使用,但您的convertStringToDate
使用dd/MM/yyyy
格式。< / p>
SimpleDateFormat
使用模式dd/MM/yyyy
来解析实际位于stringValue
的{{1}},因为格式化程序无法确定哪些值代表什么,它假设和本月的更正为MM/dd/yyyy
,但滚动年份。
对此进行简单的检查是将结果20
与Date
进行比较,方法是将String
格式化为原始格式化程序,例如......
Date
现在返回public java.util.Date convertStringToDate(String stringValue) {
String[] formatStrings = {"dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy"};
for (String formatString : formatStrings) {
try {
DateFormat df = new SimpleDateFormat(formatString);
java.util.Date date = df.parse(stringValue);
if (df.format(date).equals(stringValue)) {
System.out.println(formatString + "; " + stringValue + "; " + date);
return date;
}
} catch (ParseException e) {
}
}
return null;
}
。
但是,如果我在null
方法中将MM/dd/yyyy
添加到formatStrings
(String[] formatStrings = {"dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy", "MM/dd/yyyy"};
),则会返回convertStringToDate
答案 1 :(得分:1)
您可能需要查看java.time包和DateTimeFormatter课程。 (Tutorial)
原始的java日期和时间实用程序存在许多缺陷,使它们容易出现程序员错误。
java.time有immutable objects等其他深思熟虑的设计。这是新的事实上的标准。
例如:
String date_string = "03/20/2020";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate parsedDate = LocalDate.parse(date_string, formatter);
不会默默地失败。相反,它会抛出异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '03/20/2020' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 20
并且调试可能会更快......