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 }

 

相关文章
|
14天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
42 0
|
2天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
6天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
4天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
8天前
|
Java API
java date 增加10s后的时间
在 Java 中,要将 `Date` 对象增加 10 秒,可以通过 `Calendar` 类(适用于 Java 8 之前)或 `java.time` 包中的 `LocalDateTime`、`ZonedDateTime` 和 `Instant` 类(Java 8 及以上)实现。使用 `Calendar` 类时,需设置并修改 `Calendar` 实例。而在 `java.time` 包中,可以使用 `plus` 方法结合 `ChronoUnit.SECONDS` 来增加秒数。具体选择取决于是否需要处理时区以及 Java 版本。
|
15天前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。
|
2天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
|
11天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
|
14天前
|
缓存 安全 Java
Java String类
Java String类
12 0