日期回文查找器无法正常运行 (Java)

Date Palindrome finder is not functioning correctly (Java)

我对编程很陌生,我试图找到下一个最近的回文日期,我编写了以下代码。但我面临的问题是它不断打印出同样的东西,而不是增加日期或月份。我试过对此进行调试,但我没有看到哪里出错了,谁能告诉我该怎么做!

 public static void main(String[] args) {

    Date date = new Date();
    int year = 1900+date.getYear();
    int month = 1+date.getMonth();
    int currDate = date.getDate();

    String currDate1 = formatter(currDate);
    String month1 = formatter(month);

    String theDate = currDate1+month1+year;

    while(palindromeChecker(theDate)){

        if(month==12) {
            year++;
            month=1;
        }

        if(year%4 == 0 && year%100 !=0 && year%400 == 0) {
            if (month == 2 && currDate == 29) {
                month++;
                currDate = 1;
            }
        }
        else {
            if (month == 2 && currDate == 28) {
                month++;
                currDate = 1;
            }
        }
        switch (month){
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                if(currDate==31) month++; currDate=1; break;
            case 4: case 6: case 9: case 11:
                if(currDate==30) month++; currDate=1; break;
        }

        currDate++;

        theDate = formatter(currDate)+formatter(month)+year;

        System.out.println(theDate);
    }

}

public static String formatter(int a){
    return new DecimalFormat("00").format(a);
}

public static boolean palindromeChecker(String a){
    String b = new StringBuilder(a).reverse().toString();
    if(a.equals(b)) return false;
    else return true;
}

头几天工作正常,因为是二月。对于那个特殊情况,你已经正确地做到了。

然后在 3 月份,您在 switch case 语句中的月份检查中一次又一次地将日期重置为 1。尝试将 "currDate = 1;" 行移动到 if 块内。

问题出现了,因为你把两个语句放在一行中,没有用大括号。

if(currDate==30) month++; currDate=1;

请始终像这样为您的块使用大括号(这也是编码指南的一部分):

if(currDate==30) {
    month++;
    currDate=1;
}

这个练习很好,但是很抱歉,你做错了。我认为我能做的最糟糕的事情就是为您解决问题并发布完整的 and/or 可执行代码。因此,我将尝试引导您找到解决任务的正确方法。如果您尝试遇到问题,请随时在评论中跟进。

java.time

首先,使用 LocalDate 作为日期,而不是 Date。尽管名称 Date class 并不代表日期,而是代表时间点(在那个时间点,地球上任何地方都不会是同一日期)。相反, LocalDate 恰好是一个没有时间和时区的日期。正是您所需要的。另外 Date class 一直设计得很差,现在早就过时了。

例如,要获取您所在时区的今天日期

    LocalDate date = LocalDate.now(ZoneId.systemDefault());

如果需要,您可以将不同的时区传递给 now 方法。

要将日期转换为字符串以便您可以检查它是否是回文,请使用 DateTimeFormatterLocalDateformat 方法。您可以使用 DateTimeFormatter.ofPattern() 来构造格式化程序。当所有这些听起来含糊甚至难以理解时,请使用您的搜索引擎查找示例和教程以充实它,或者查看文档,使用底部的链接。

你检查一个字符串是否是回文的方法很优雅,所以你应该坚持下去。

当一个日期不是回文时,使用LocalDateplusDays方法加上1天,得到第二天。 LocalDate 知道第二天,所以你不需要关心每个月的天数,也不需要关心闰年,这一切都为你处理。只记得 plusDays() returns 需要存储到变量中的 new LocalDate 实例。

链接