在java

时间:2015-12-09 04:45:25

标签: java

一个非常愉快的早晨,我只有一个查询,下面是执行年份的程序。让我们说日期作为输入是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;

    }

}

2 个答案:

答案 0 :(得分:2)

您的原始String日期似乎采用MM/dd/yyyy格式,extractDate使用,但您的convertStringToDate使用dd/MM/yyyy格式。< / p>

SimpleDateFormat使用模式dd/MM/yyyy来解析实际位于stringValue的{​​{1}},因为格式化程序无法确定哪些值代表什么,它假设和本月的更正为MM/dd/yyyy,但滚动年份。

对此进行简单的检查是将结果20Date进行比较,方法是将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添加到formatStringsString[] formatStrings = {"dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy", "MM/dd/yyyy"};),则会返回convertStringToDate

答案 1 :(得分:1)

java.time

您可能需要查看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

并且调试可能会更快......