java积累----Calendar----获取上月的起始时间和上月结束时间




我们在进行数据统计的时候,一个常用的场景是需要统计上月的数据,上月的数据获取需要拿到上月的第一天和最后一天。


实现代码如下:


    public static void main(String[] args) {
		Calendar c=Calendar.getInstance();
		c.add(Calendar.MONTH, -1);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
		String gtimelast = sdf.format(c.getTime()); //上月
		System.out.println(gtimelast);
		int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println(lastMonthMaxDay);
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), lastMonthMaxDay, 23, 59, 59);
		
		//按格式输出
		String gtime = sdf.format(c.getTime()); //上月最后一天
		System.out.println(gtime);
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-01  00:00:00");
		String gtime2 = sdf2.format(c.getTime()); //上月第一天
		System.out.println(gtime2);
	}


当前时间是 2017-07-31时,输出结果如下:






这里需要注意 

① Calendar除了getActualMaximum方法之外,还有一个看起来类似的方法getMaximum,但是这两个方法是不同的:
getActualMaximum 返回实际的最大数值,getMaximum 返回的是可能的最大数值。


上面的代码如果改成getMaximum,那么一般情况都会恒定的返回31 (月份中可能的最大天数是31)


也就是说如果使用getMaximum,当前时间是2017-07-31时,推算出上个月的时间为2017-06-31,因为6月没有31号,所以会出错,导致上月最大时间变成2017-07-01。






② Calendar 的月份取值范围是 0 - 11 , 0代表1月 11代表12月份
(这是因为Java中的月份遵循了罗马历中的规则:当时一年中的月份数量是不固定的,第一个月是JANUARY。而Java中Calendar.MONTH返回的数值其实是当前月距离第一个月有多少个月份的数值,JANUARY在Java中返回“0”,所以我们操作月份的时候会根据需要做 +1 或 -1 的处理)








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小凡vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值