因项目需要,需要遍历一年中的其中几个月,获得每个月的用户数量。  变量有:开始时间--startDate,结束时间--endDate。

逻辑很简单:获取到开始时间的月份和结束时间的月份,然后得到月份差值,进行for循环遍历,遍历的时候判断用户注册的时间是否在这个月里,然后得出结果。

关键就在于:判断用户注册的时间是否在这个月里。

想了一个办法:假如一个用户的注册时间是 2016-09-05 22:05 ,那么判断这个用户的 注册时间是否小于 [2016-09-30 23:59] 就可以了。

好了,逻辑清楚了,问题来了:怎么获取每个月份的最大时间(每个月的最后一天、最后一小时、最后一分钟、最后一秒)呢?

查了查Java的api 发现官方推荐使用 java.util.Calendar; 而 java.util.Date; 里面的很多方法都已经不被推荐使用了。 比如:Date.getDate();

Calendar很好用 采用的是单例模式,通过:Calendar.getInstance();获取他的实例。使用Calendar.setTime(Date date);设置时间 。

代码:

 //获取实例
Calendar calendarInstance = Calendar.getInstance();
//设置时间
calendarInstance.setTime(startTime);

好了重点来了,假如当前Calendar实例的时间是:2016-09-05 22:05 ,则变化到最大的时间为:2016-09-30 23:59 

看代码:

 //设置每月的最大天数
calendarInstance.set(Calendar.DAY_OF_MONTH, calendarInstance.getActualMaximum(Calendar.DAY_OF_MONTH));
//设置每天的最大小时
calendarInstance.set(Calendar.HOUR_OF_DAY, calendarInstance.getActualMaximum(Calendar.HOUR_OF_DAY));
//设置每小时最大分钟
calendarInstance.set(Calendar.MINUTE, calendarInstance.getActualMaximum(Calendar.MINUTE));
//设置每分钟最大秒
calendarInstance.set(Calendar.SECOND, calendarInstance.getActualMaximum(Calendar.SECOND));

Calendar 的set方法可以设置时间中的值比如:

Calendar.SECOND  秒
Calendar.MINUTE  分钟
等等

Calendar 的getActualMaximum方法可以得到单位时间的最大值。比如:每月最多有几天,每天最多几个小时等等

这样就得到了已知时间在单位时间(每个月)内的最大值。同理单位时间为每天的话,类似的道理。

这还没完呢。

整个程序里只有两个变量,开始和结束的时间,中间的时候需要手动加。

2016-09-05 22:05 的下个月的最大时间应该是:2016-10-31 23:59

我一开始用的方法是:

calendarInstance.set(Calendar.MONTH, calendarInstance.get(Calendar.MONTH) + 1 );

发现bug,当开始时间的月份有31天的话,这样得出的结果就是下下个月 比如:开始时间--2016-05-31 23:59  转换后的时间是--2016-07-01 23:59

怎么会多一个月?

想来想去猜测是这个原因:5月有31天。而6月只有30天 如果直接使用 set方法设置月份的话,就得到 6月31号 但是6月没有31号于是 Calendar 自动进位,就变成了 7月01号。

解决办法是:使用Calendar.add(int field, int amount); 第一个参数是 字段(月份,天,小时..),第二个参数是 增量。

这样就可以直接从 5月31号 变成6月30号了。

欢迎加入 java开发群:497036534。

Java Calendar.set 方法设置时间的问题的更多相关文章

  1. Calendar.set方法获取前一天的当前时刻

    获取前几天的当前时刻的时间方法 Calendar cal = Calendar.getInstance(); Date date = new Date();// 获取当前时间 cal.setTime( ...

  2. Java Calendar 类的时间操作

    Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...

  3. java中获取日期和时间的方法总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  4. Java Calendar 类的时间操作.RP

    JavaCalendar 类时间操作,这也许是创建和管理日历最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 原文地址:blog.csdn.NET/joyous/a ...

  5. (干货)java中如何根据一个时间获取属于本年那一周,本周的开始时间以及最后一天时间。并且设置起始时间为周6.结束时间为周5

    本人亲测,有用,适用性比较强,直接上代码说话. package com.helloBike.data; import java.text.ParseException; import java.tex ...

  6. java Calendar类得到每个月的周末是几号的工具方法

    public static List getWeekendInMonth(int year, int month) { List list = new ArrayList(); Calendar ca ...

  7. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  8. (转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  9. Java向mysql中插入时间的方法

    ava向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源  java向MySQL插入当前时间的四种方式 第一种:将java.util.Date类型的 ...

随机推荐

  1. jdk8 之 java.time包AND DateUtils

    package com.jansh.comm.util; import java.time.Clock; import java.time.LocalDate; import java.time.Lo ...

  2. 为什么32位操作系统最大支持4GB内存

    因为32位操作系统的地址空间为32位,地址总数为2^32,每个地址对应1Byte内存空间,这样,32位操作系统管理的最大内存空间限制为2^32Byte=4*1024*1024*1024Byte,即4G ...

  3. DOMContentLoaded

    setTimeout(function(){ alert("settimeout"); },0); EventUtil.addHandler(window, "DOMCo ...

  4. Borda count

    波达计数法(Borda Count)是较为简单的排序投票法,每个选项借由选票上的排序来取得积分,积分最高者获胜.另一个类似的方法则是位置投票制. 投票人按喜好排列候选者.如果候选者在选票的排第一位,它 ...

  5. Angular - -ngKeydown/ngKeypress/ngKeyup 键盘事件和鼠标事件

    ngKeydown/ngKeypress/ngKeyup 该指令在按键按下/按键按下/按键松开时执行指定表达式. ngKeydown和ngKeypress略有不同,目前的测试是ngKeypress针对 ...

  6. Angular - - ngApp、ngBind、ngBindHtml、ngNonBindable

    对于ng-系列的指令,每篇文章写2-5个吧,不然显得文章好短.... ngApp 使用这个指令自动启动一个AngularJS应用.ngApp指令指定了应用程序的根节点,通常会将ngApp放置在网页的根 ...

  7. MySQL服务器的线程数查看方法

    mysql重启命令:/etc/init.d/mysql restart MySQL服务器的线程数需要在一个合理的范围之内,这样才能保证MySQL服务器健康平稳地运行.Threads_created表示 ...

  8. Mac 安装Rudy环境 pod安装前的准备工作

    之前已经说过怎么使用pod 今天说一下安装pod之前的准备工作 首先呢就是Rudy 环境(前提是你已经安装了Xcode) 在终端输入一下命令 期间可能也许会要你输入密码 curl -L https:/ ...

  9. HTML5中将video设置为背景的方法

    主要用到了video标签,css样式,原理是先将video标签利用position:fixed;使video标签脱离文档流,在将他的z-index设置为最低的,比如-9999.再插入的内容自然就覆盖在 ...

  10. .NET Core 最小化发布

    .NET Core 应用最小化独立部署发布,.NET Core 默认应用独立发布,大概占用50m左右的空间,不同的系统大小有所区别. .NET Core 的发布之前我也有所介绍,.NET Core 跨 ...