开发者社区> 陈嘻嘻哈哈> 正文

Java对日期Date类进行日期加减运算,年份加减,月份加减

简介: 1 package com.cy; 59 import java.security.InvalidParameterException; 60 import java.text.ParseException; 61 import java.
+关注继续查看
  1 package com.cy;

 59 import java.security.InvalidParameterException;
 60 import java.text.ParseException;
 61 import java.text.SimpleDateFormat;
 62 import java.util.ArrayList;
 63 import java.util.Calendar;
 64 import java.util.Date;
 65 import java.util.HashMap;
 66 import java.util.Map;
 67 
 68 public class DateUtils {
 69     private static final long MILLIS_IN_A_SECOND = 1000;
 70 
 71     private static final long SECONDS_IN_A_MINUTE = 60;
 72 
 73     private static final int MONTHS_IN_A_YEAR = 12;
 74 
 75     /**
 76      * 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等 时间为23:59:59。
 77      * 
 78      * @param origDate
 79      *            基准日期
 80      * @param amount
 81      *            时间数量
 82      * @param timeUnit
 83      *            时间单位,如年、月、日等。用Calendar中的常量代表
 84      * @return {@link Date}
 85      */
 86     public static final Date dateAfter(Date origDate, int amount, int timeUnit) {
 87         Calendar calendar = Calendar.getInstance();
 88         calendar.setTime(origDate);
 89         // 将小时至0
 90         // calendar.set(Calendar.HOUR_OF_DAY, 23);
 91         // 将分钟至0
 92         // calendar.set(Calendar.MINUTE, 59);
 93         // 将秒至0
 94         // calendar.set(Calendar.SECOND, 59);
 95         // 将毫秒至0
 96         // calendar.set(Calendar.MILLISECOND, 0);
 97         calendar.add(timeUnit, amount);
 98         return calendar.getTime();
 99     }
100 
101     /**
102      * 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
103      * 
104      * @param origDate
105      *            基准日期
106      * @param amount
107      *            时间数量
108      * @param timeUnit
109      *            时间单位,如年、月、日等。用Calendar中的常量代表
110      * @return {@link Date}
111      */
112     public static final Date timeAfter(Date origDate, int amount, int timeUnit) {
113         Calendar calendar = Calendar.getInstance();
114         calendar.setTime(origDate);
115         calendar.add(timeUnit, amount);
116         return calendar.getTime();
117     }
118 
119     /**
120      * 获得指定日期之前一段时期的日期。例如某日期之前3天的日期等。
121      * 
122      * @param origDate
123      *            基准日期
124      * @param amount
125      *            时间数量
126      * @param timeUnit
127      *            时间单位,如年、月、日等。用Calendar中的常量代表
128      * @return {@link Date}
129      */
130     public static final Date dateBefore(Date origDate, int amount, int timeUnit) {
131         Calendar calendar = Calendar.getInstance();
132         calendar.add(timeUnit, -amount);
133         return calendar.getTime();
134     }
135 
136     /**
137      * 根据年月日构建日期对象。注意月份是从1开始计数的,即month为1代表1月份。
138      * 
139      * @param year
140      *            年
141      * @param month
142      *            月。注意1代表1月份,依此类推。
143      * @param day
144      *            日
145      * @return {@link Date}
146      */
147     public static Date date(int year, int month, int date) {
148         Calendar calendar = Calendar.getInstance();
149         calendar.set(year, month - 1, date, 0, 0, 0);
150         calendar.set(Calendar.MILLISECOND, 0);
151         return calendar.getTime();
152     }
153 
154     /**
155      * 计算两个日期(不包括时间)之间相差的周年数
156      * 
157      * @param date1
158      *            开始时间
159      * @param date2
160      *            结束时间
161      * @return {@link Integer}
162      */
163     public static int getYearDiff(Date date1, Date date2) {
164         if (date1 == null || date2 == null) {
165             throw new InvalidParameterException("date1 and date2 cannot be null!");
166         }
167         if (date1.after(date2)) {
168             throw new InvalidParameterException("date1 cannot be after date2!");
169         }
170 
171         Calendar calendar = Calendar.getInstance();
172         calendar.setTime(date1);
173         int year1 = calendar.get(Calendar.YEAR);
174         int month1 = calendar.get(Calendar.MONTH);
175         int day1 = calendar.get(Calendar.DATE);
176 
177         calendar.setTime(date2);
178         int year2 = calendar.get(Calendar.YEAR);
179         int month2 = calendar.get(Calendar.MONTH);
180         int day2 = calendar.get(Calendar.DATE);
181 
182         int result = year2 - year1;
183         if (month2 < month1) {
184             result--;
185         } else if (month2 == month1 && day2 < day1) {
186             result--;
187         }
188         return result;
189     }
190 
191     /**
192      * 计算两个日期(不包括时间)之间相差的整月数
193      * 
194      * @param date1
195      *            开始时间
196      * @param date2
197      *            结束时间
198      * @return {@link Integer}
199      */
200     public static int getMonthDiff(Date date1, Date date2) {
201         if (date1 == null || date2 == null) {
202             throw new InvalidParameterException("date1 and date2 cannot be null!");
203         }
204         if (date1.after(date2)) {
205             throw new InvalidParameterException("date1 cannot be after date2!");
206         }
207 
208         Calendar calendar = Calendar.getInstance();
209         calendar.setTime(date1);
210         int year1 = calendar.get(Calendar.YEAR);
211         int month1 = calendar.get(Calendar.MONTH);
212         int day1 = calendar.get(Calendar.DATE);
213 
214         calendar.setTime(date2);
215         int year2 = calendar.get(Calendar.YEAR);
216         int month2 = calendar.get(Calendar.MONTH);
217         int day2 = calendar.get(Calendar.DATE);
218 
219         int months = 0;
220         if (day2 >= day1) {
221             months = month2 - month1;
222         } else {
223             months = month2 - month1 - 1;
224         }
225         return (year2 - year1) * MONTHS_IN_A_YEAR + months;
226     }
227 
228     /**
229      * 统计两个日期之间包含的天数。包含date1,但不包含date2
230      * 
231      * @param date1
232      *            开始时间
233      * @param date2
234      *            结束时间
235      * @return {@link Integer}
236      * @throws ParseException
237      */
238     public static int getDayDiff(Date date1, Date date2) {
239         if (date1 == null || date2 == null) {
240             throw new InvalidParameterException("date1 and date2 cannot be null!");
241         }
242         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
243         Date smdate;
244         try {
245             smdate = sdf.parse(sdf.format(date1));
246             Date bdate = sdf.parse(sdf.format(date2));
247             Calendar cal = Calendar.getInstance();
248             cal.setTime(smdate);
249             long time1 = cal.getTimeInMillis();
250             cal.setTime(bdate);
251             long time2 = cal.getTimeInMillis();
252             long between_days = (time2 - time1) / (1000 * 3600 * 24);
253             return Integer.parseInt(String.valueOf(between_days));
254         } catch (ParseException e) {
255             e.printStackTrace();
256         }
257         return 0;
258     }
259 
260     /**
261      * 计算time2比time1晚多少分钟,忽略日期部分
262      * 
263      * @param time1
264      * @param time2
265      * @return
266      */
267     public static int getMinuteDiffByTime(Date time1, Date time2) {
268         long startMil = 0;
269         long endMil = 0;
270         Calendar calendar = Calendar.getInstance();
271         calendar.setTime(time1);
272         calendar.set(1900, 1, 1);
273         startMil = calendar.getTimeInMillis();
274         calendar.setTime(time2);
275         calendar.set(1900, 1, 1);
276         endMil = calendar.getTimeInMillis();
277         return (int) ((endMil - startMil) / MILLIS_IN_A_SECOND / SECONDS_IN_A_MINUTE);
278     }
279 
280     /**
281      * 计算时间是否是同一天
282      * 
283      * @param dateA
284      * @param dateB
285      * @return
286      */
287     public static boolean areSameDay(Date dateA, Date dateB) {
288         Calendar calDateA = Calendar.getInstance();
289         calDateA.setTime(dateA);
290 
291         Calendar calDateB = Calendar.getInstance();
292         calDateB.setTime(dateB);
293 
294         return calDateA.get(Calendar.YEAR) == calDateB.get(Calendar.YEAR)
295                 && calDateA.get(Calendar.MONTH) == calDateB.get(Calendar.MONTH)
296                 && calDateA.get(Calendar.DAY_OF_MONTH) == calDateB.get(Calendar.DAY_OF_MONTH);
297     }
298 
299     /**
300      * @Title: getCurrYearLast
301      * @Description: 获取某年最后一天
302      * @param date
303      * @return Date
304      */
305     public static Date getCurrYearLast(Date date) {
306         Calendar currCal = Calendar.getInstance();
307         currCal.setTime(date);
308         int currentYear = currCal.get(Calendar.YEAR);
309         return getYearLast(currentYear);
310     }
311 
312     private static Date getYearLast(int year) {
313         Calendar calendar = Calendar.getInstance();
314         calendar.clear();
315         calendar.set(Calendar.YEAR, year);
316 
317         calendar.roll(Calendar.DAY_OF_YEAR, -1);
318         // 将小时至0
319         calendar.set(Calendar.HOUR_OF_DAY, 23);
320         // 将分钟至0
321         calendar.set(Calendar.MINUTE, 59);
322         // 将秒至0
323         calendar.set(Calendar.SECOND, 59);
324         // 将毫秒至0
325         calendar.set(Calendar.MILLISECOND, 0);
326 
327         Date currYearLast = calendar.getTime();
328         return currYearLast;
329     }
330     /*
331      * private static Date getYearLast(int year) { Calendar calendar =
332      * Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR,
333      * year); calendar.roll(Calendar.DAY_OF_YEAR, -1); Date currYearLast =
334      * calendar.getTime(); return currYearLast; }
335      */
336     /**
337      * 
338      * @param args
339      * @throws ParseException
340      * 
341      * 根据结算周期数  对开始时间与结束时间进行分段
342      */
343     public static void main(String[] args) throws ParseException {
344         /*开始时间*/
345         Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-1-20 10:31:36");
346         /*结束时间*/
347         Date endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-5-12 10:31:36");
348         /*周期数*/
349         int solt = 2;
350         ArrayList<Map<String, Object>> list = new ArrayList<>();
351         
352         while (startDate.getTime()<endDate.getTime()) {
353             Map<String, Object> map = new HashMap<>();
354             map.put("开始时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate));
355             startDate=dateAfter(startDate, solt, Calendar.MONTH);
356             if (startDate.getTime()>endDate.getTime()) {
357                 map.put("结束时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endDate));
358                 
359             } else {
360                 map.put("结束时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate));
361             }
362             list.add(map);
363         }
364         System.out.println(list);
365     }
366 }

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
看山聊 Java:检查日期字符串是否合法
这次说一下,怎样检查给出的字符串,是否是合法日期字符串。本文将从 Java 原生和第三方组件两种方式来说明。
112 0
js Date 日期函数
整理了一下浏览器收藏夹里的东西,发现好多连接都死掉了 Date 对象用于处理日期和时间。 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值。 参数形式有以下5种:      new Date("month dd,yyyy hh:mm:ss");    new Date("month dd,yy
1254 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29326 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20802 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23605 0
告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(下)
告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解
52 0
+关注
陈嘻嘻哈哈
我是一个小小的程序媛!
241
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载