日期回文查找器无法正常运行 (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
方法。
要将日期转换为字符串以便您可以检查它是否是回文,请使用 DateTimeFormatter
和 LocalDate
的 format
方法。您可以使用 DateTimeFormatter.ofPattern()
来构造格式化程序。当所有这些听起来含糊甚至难以理解时,请使用您的搜索引擎查找示例和教程以充实它,或者查看文档,使用底部的链接。
你检查一个字符串是否是回文的方法很优雅,所以你应该坚持下去。
当一个日期不是回文时,使用LocalDate
的plusDays
方法加上1天,得到第二天。 LocalDate
知道第二天,所以你不需要关心每个月的天数,也不需要关心闰年,这一切都为你处理。只记得 plusDays()
returns 需要存储到变量中的 new LocalDate
实例。
链接
我对编程很陌生,我试图找到下一个最近的回文日期,我编写了以下代码。但我面临的问题是它不断打印出同样的东西,而不是增加日期或月份。我试过对此进行调试,但我没有看到哪里出错了,谁能告诉我该怎么做!
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
方法。
要将日期转换为字符串以便您可以检查它是否是回文,请使用 DateTimeFormatter
和 LocalDate
的 format
方法。您可以使用 DateTimeFormatter.ofPattern()
来构造格式化程序。当所有这些听起来含糊甚至难以理解时,请使用您的搜索引擎查找示例和教程以充实它,或者查看文档,使用底部的链接。
你检查一个字符串是否是回文的方法很优雅,所以你应该坚持下去。
当一个日期不是回文时,使用LocalDate
的plusDays
方法加上1天,得到第二天。 LocalDate
知道第二天,所以你不需要关心每个月的天数,也不需要关心闰年,这一切都为你处理。只记得 plusDays()
returns 需要存储到变量中的 new LocalDate
实例。