1,代码形式:此代码借鉴执梗大佬。执梗
public class Main{
static int[] M= {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
int ans=0;
int y=1900,m=1,d=1;
//先升日期再升值
//一直在疑惑9999,12,31没有判断,实际判断了,因为先增日期,在判断的。
//9999.12.30执行时,d++,判断的31号的。
//同时1900.1.1没有判断的,直接从1900.1.2开始的判断。
while(y!=9999||m!=12||d!=31) {
if(y%400==0||(y%4==0&&y%100!=0)){
M[2]=29;
}else {
M[2]=28;
}
d++;
if(d>M[m]) {
m++;
d=1;
}
if(m>12) {
m=1;
y++;
}
//此处调用对日期的判断的处理函数,完成题目的要求。
//if(check(y,m,d)) {
// ans++;
//}
}
System.out.println(ans);
}
}
2,API遍历形式:代码有点问题,如果开始时间早于1949.5.2就会进入死循环。例如begindate设为1949.5.1就会停不下来。具体原因看下方。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class 遍历时间段 {
public static void main(String[] args) throws ParseException {
Calendar c = Calendar.getInstance();
SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
Date begindate = simple.parse("2022-1-1");
Date enddate = simple.parse("2022-3-2");
Date tmp = begindate;
while(!tmp.equals(enddate)) {
System.out.println(simple.format(tmp));
c.setTime(tmp);
c.add(Calendar.DATE, 1);
tmp = c.getTime();
}
}
}
进入死循环主要是因为日期没有判定相同,把所有tmp的CST时间打印出来看结果

从1949.5.1的每天开始时间变为了1点。这时用enddate的0点去比较,自然会认为不相等,也就进入了死循环了。至于为什么突然变为了1点,不知道没想明白。有了解的大佬,可以评论给一下解释。这里初步猜测是这个CDT时间有关。这个是北美夏令时,比CST提前一个小时。但是打印结果显示,只在这一年的这个月突然使用了CDT,别的没有,没搞懂,不理解,不知道。
CDT和CST:https://zh-cn.livingeconomyadvisors.com/19476-is-dallas-cst-or-cdt
解决如下:
修改点:
1,while循环中添加:c.set(Calendar.HOUR_OF_DAY,0);
2,c.clear();可以加上
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class 遍历时间段 {
public static void main(String[] args) throws ParseException {
Calendar c = Calendar.getInstance();
SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
c.clear(); //这个clear最好也加上,calendar有时因为这个也会有些坑。。
Date begindate = simple.parse("1900-1-1");
Date enddate = simple.parse("10000-03-01");
//Date aa = simple.parse("1966-03-01");
Date tmp = begindate;
int count = 0;
while(enddate.compareTo(tmp) != 0) {
System.out.println(simple.format(tmp));
c.setTime(tmp);
c.add(Calendar.DATE, 1);
c.set(Calendar.HOUR_OF_DAY,0);
tmp = c.getTime();
}
}
参考:
https://blog.youkuaiyun.com/weixin_41713281/article/details/104390355
https://www.cnblogs.com/nathansz/p/6055468.html
java还有其他的相关日期类。
Date类。
Calendar类
LocalDate类等。
本文介绍两种日期遍历的方法:一种是通过自定义数组实现日期的递增与判断;另一种是利用Java API进行日期的遍历。针对API遍历方法出现的死循环问题进行了详细分析并给出解决方案。
732

被折叠的 条评论
为什么被折叠?



