因项目需要,需要遍历一年中的其中几个月,获得每个月的用户数量。  变量有:开始时间--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. iOS 加载动态库报错问题

    dyld: Library not loaded: @rpath Referenced from: Reason: no suitable image found.  Did find: 要么使用静态 ...

  2. Angular - - $location 和 $window

    $location $location服务解析浏览器地址中的url(基于window.location)并且使url在应用程序中可用.将地址栏中的网址的变化反映到$location服务和$locati ...

  3. oracle语句总结(一)

    1,建外键 新建两个表来实现外键的关联. create table main_tab ( id number, name varchar2(30) ); create table sub_tab ( ...

  4. jQuery wrap wrapAll wrapInner使用

    jQuery wrap wrapAll wrapInner使用 <%@ page language="java" import="java.util.*" ...

  5. 《深度探索C++对象模型》笔记——Function语意学

    member的各种调用方式 C++支持三种类型的member functions:static.nonstatic和virtual. nonstatic member functions会被编译器转换 ...

  6. vue初探

    vue初探 很多同学一定都听过MVVM.组件.数据绑定之类的专业术语,而vue框架正是这样的一种框架.vue的作用是:通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 第一部分:vue介 ...

  7. python关于列表的操作

    列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类 ...

  8. HDU4474

    Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  9. Fourier分析基础(一)——Fourier级数

    前言 傅立叶分析的作用是把一个函数变成一堆三角函数的和的形式,也就是分解.首先引入的是傅立叶级数,Fourier级数的作用是把函数变为可数无限个三角函数的和,而且这些三角函数的频率都是某个基频的整数倍 ...

  10. Objective-c runtime方法替换引发的死循环

    在OC中: API: class_addMethod往一个Class里添加method API: class_getInstanceMethod或class_getClassMethod可以判断某个S ...