java日期遍历

本文介绍两种日期遍历的方法:一种是通过自定义数组实现日期的递增与判断;另一种是利用Java API进行日期的遍历。针对API遍历方法出现的死循环问题进行了详细分析并给出解决方案。

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类等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值