Java对日期Date类进行日期加减运算,年份加减,月份加减
package com.cy; import java.security.InvalidParameterException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; public class DateUtils {
private static final long MILLIS_IN_A_SECOND = 1000; private static final long SECONDS_IN_A_MINUTE = 60; private static final int MONTHS_IN_A_YEAR = 12; /**
* 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等 时间为23:59:59。
*
* @param origDate
* 基准日期
* @param amount
* 时间数量
* @param timeUnit
* 时间单位,如年、月、日等。用Calendar中的常量代表
* @return {@link Date}
*/
public static final Date dateAfter(Date origDate, int amount, int timeUnit) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(origDate);
// 将小时至0
// calendar.set(Calendar.HOUR_OF_DAY, 23);
// 将分钟至0
// calendar.set(Calendar.MINUTE, 59);
// 将秒至0
// calendar.set(Calendar.SECOND, 59);
// 将毫秒至0
// calendar.set(Calendar.MILLISECOND, 0);
calendar.add(timeUnit, amount);
return calendar.getTime();
} /**
* 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
*
* @param origDate
* 基准日期
* @param amount
* 时间数量
* @param timeUnit
* 时间单位,如年、月、日等。用Calendar中的常量代表
* @return {@link Date}
*/
public static final Date timeAfter(Date origDate, int amount, int timeUnit) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(origDate);
calendar.add(timeUnit, amount);
return calendar.getTime();
} /**
* 获得指定日期之前一段时期的日期。例如某日期之前3天的日期等。
*
* @param origDate
* 基准日期
* @param amount
* 时间数量
* @param timeUnit
* 时间单位,如年、月、日等。用Calendar中的常量代表
* @return {@link Date}
*/
public static final Date dateBefore(Date origDate, int amount, int timeUnit) {
Calendar calendar = Calendar.getInstance();
calendar.add(timeUnit, -amount);
return calendar.getTime();
} /**
* 根据年月日构建日期对象。注意月份是从1开始计数的,即month为1代表1月份。
*
* @param year
* 年
* @param month
* 月。注意1代表1月份,依此类推。
* @param day
* 日
* @return {@link Date}
*/
public static Date date(int year, int month, int date) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, date, 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
} /**
* 计算两个日期(不包括时间)之间相差的周年数
*
* @param date1
* 开始时间
* @param date2
* 结束时间
* @return {@link Integer}
*/
public static int getYearDiff(Date date1, Date date2) {
if (date1 == null || date2 == null) {
throw new InvalidParameterException("date1 and date2 cannot be null!");
}
if (date1.after(date2)) {
throw new InvalidParameterException("date1 cannot be after date2!");
} Calendar calendar = Calendar.getInstance();
calendar.setTime(date1);
int year1 = calendar.get(Calendar.YEAR);
int month1 = calendar.get(Calendar.MONTH);
int day1 = calendar.get(Calendar.DATE); calendar.setTime(date2);
int year2 = calendar.get(Calendar.YEAR);
int month2 = calendar.get(Calendar.MONTH);
int day2 = calendar.get(Calendar.DATE); int result = year2 - year1;
if (month2 < month1) {
result--;
} else if (month2 == month1 && day2 < day1) {
result--;
}
return result;
} /**
* 计算两个日期(不包括时间)之间相差的整月数
*
* @param date1
* 开始时间
* @param date2
* 结束时间
* @return {@link Integer}
*/
public static int getMonthDiff(Date date1, Date date2) {
if (date1 == null || date2 == null) {
throw new InvalidParameterException("date1 and date2 cannot be null!");
}
if (date1.after(date2)) {
throw new InvalidParameterException("date1 cannot be after date2!");
} Calendar calendar = Calendar.getInstance();
calendar.setTime(date1);
int year1 = calendar.get(Calendar.YEAR);
int month1 = calendar.get(Calendar.MONTH);
int day1 = calendar.get(Calendar.DATE); calendar.setTime(date2);
int year2 = calendar.get(Calendar.YEAR);
int month2 = calendar.get(Calendar.MONTH);
int day2 = calendar.get(Calendar.DATE); int months = 0;
if (day2 >= day1) {
months = month2 - month1;
} else {
months = month2 - month1 - 1;
}
return (year2 - year1) * MONTHS_IN_A_YEAR + months;
} /**
* 统计两个日期之间包含的天数。包含date1,但不包含date2
*
* @param date1
* 开始时间
* @param date2
* 结束时间
* @return {@link Integer}
* @throws ParseException
*/
public static int getDayDiff(Date date1, Date date2) {
if (date1 == null || date2 == null) {
throw new InvalidParameterException("date1 and date2 cannot be null!");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date smdate;
try {
smdate = sdf.parse(sdf.format(date1));
Date bdate = sdf.parse(sdf.format(date2));
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600 * 24);
return Integer.parseInt(String.valueOf(between_days));
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
} /**
* 计算time2比time1晚多少分钟,忽略日期部分
*
* @param time1
* @param time2
* @return
*/
public static int getMinuteDiffByTime(Date time1, Date time2) {
long startMil = 0;
long endMil = 0;
Calendar calendar = Calendar.getInstance();
calendar.setTime(time1);
calendar.set(1900, 1, 1);
startMil = calendar.getTimeInMillis();
calendar.setTime(time2);
calendar.set(1900, 1, 1);
endMil = calendar.getTimeInMillis();
return (int) ((endMil - startMil) / MILLIS_IN_A_SECOND / SECONDS_IN_A_MINUTE);
} /**
* 计算时间是否是同一天
*
* @param dateA
* @param dateB
* @return
*/
public static boolean areSameDay(Date dateA, Date dateB) {
Calendar calDateA = Calendar.getInstance();
calDateA.setTime(dateA); Calendar calDateB = Calendar.getInstance();
calDateB.setTime(dateB); return calDateA.get(Calendar.YEAR) == calDateB.get(Calendar.YEAR)
&& calDateA.get(Calendar.MONTH) == calDateB.get(Calendar.MONTH)
&& calDateA.get(Calendar.DAY_OF_MONTH) == calDateB.get(Calendar.DAY_OF_MONTH);
} /**
* @Title: getCurrYearLast
* @Description: 获取某年最后一天
* @param date
* @return Date
*/
public static Date getCurrYearLast(Date date) {
Calendar currCal = Calendar.getInstance();
currCal.setTime(date);
int currentYear = currCal.get(Calendar.YEAR);
return getYearLast(currentYear);
} private static Date getYearLast(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year); calendar.roll(Calendar.DAY_OF_YEAR, -1);
// 将小时至0
calendar.set(Calendar.HOUR_OF_DAY, 23);
// 将分钟至0
calendar.set(Calendar.MINUTE, 59);
// 将秒至0
calendar.set(Calendar.SECOND, 59);
// 将毫秒至0
calendar.set(Calendar.MILLISECOND, 0); Date currYearLast = calendar.getTime();
return currYearLast;
}
/*
* private static Date getYearLast(int year) { Calendar calendar =
* Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR,
* year); calendar.roll(Calendar.DAY_OF_YEAR, -1); Date currYearLast =
* calendar.getTime(); return currYearLast; }
*/
/**
*
* @param args
* @throws ParseException
*
* 根据结算周期数 对开始时间与结束时间进行分段
*/
public static void main(String[] args) throws ParseException {
/*开始时间*/
Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-1-20 10:31:36");
/*结束时间*/
Date endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-5-12 10:31:36");
/*周期数*/
int solt = 2;
ArrayList<Map<String, Object>> list = new ArrayList<>(); while (startDate.getTime()<endDate.getTime()) {
Map<String, Object> map = new HashMap<>();
map.put("开始时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate));
startDate=dateAfter(startDate, solt, Calendar.MONTH);
if (startDate.getTime()>endDate.getTime()) {
map.put("结束时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endDate)); } else {
map.put("结束时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate));
}
list.add(map);
}
System.out.println(list);
}
}

Java对日期Date类进行日期加减运算,年份加减,月份加减的更多相关文章
- java中的Date类
一.Date类简介 日期类主要包括Date类与Calendar类,这一节我们先介绍Date类, Date 表示特定的瞬间,精确到毫秒.Date类用于表示日期和时间,在计算机中的表示和我们现实世界使用差 ...
- Date类与日期格式
Date类概述: 表示特定的瞬间,精确到毫秒. Date()分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒).Date(long date)分配 Date 对象并初始化此对象,以表 ...
- Java基础教程——Date类和Calendar类
Date类和Calendar类都是关于日期的类,都在java.util包中,使用时需要import. Date java.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时 ...
- java基础系列--Date类
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7126930.html 1.Date类概述 Date类是从JDK1.1就开始存在的老类,其提 ...
- java基础之Date类
Date类: Date类概述 类 Date 表示特定的瞬间,精确到毫秒. 构造方法 public Date() public Date(long date) 成员方法 public long getT ...
- Java 常用对象-Date类和Calender类
2017-11-02 22:29:34 Date类:类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值 ...
- [Swift实际操作]七、常见概念-(6)日期Date和DateFormatter日期的格式化
本文将为你演示日期类型的使用,以及如何对日期进行格式化. 首先引入需要使用到的界面框架 import UIKit 初始化一个日期对象,它的值和当前电脑中的日期相同 var date = Date() ...
- JAVA基础之Date类、DateFormat类及Calendar类
个人理解: 关于Date类,进行截取或者转换时一定要注意好数据类型,long类型后面要加上L.时间的原点是1970年.用DateFormat则完成日期与文本之间的转换,特别注意的是:月是用M,时是用H ...
- Java对日期Date类进行加减运算,年份加减,月份加减
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; public class Da ...
随机推荐
- zabbix邮件自动预警
Zabbix报警 自定义脚本报警 报警大致过程 item数据采集--->触发器由阈值触发带级别的信息-->触发动作发送邮件预警 1. 发送邮件脚本 1)安装sendEmail(参考Linu ...
- nginx路径设置(web)
原文 https://www.jianshu.com/p/57db2c5d0cb9 语法 root 语法:root path 默认值:root html 配置段:http.server.locatio ...
- 利用springloaded进行java class动态替换
我们知道对于一个java文件,如Test.java,首先需要通过javac命令(javac Test.java)进行编译,生成class文件,再将class文件在jvm上进行加载运行,也就是java命 ...
- POI2014解题报告
穷酸博主没有bz权限号, 也不会去$poi$官网, 在某咕刷的$poi$,按照某咕的难度排序刷, poi~ $Luogu3572 PTA-Little Bird$ 单调队列, 队列内按照 步数为第一关 ...
- Spring MVC 的 Converter 和 Formatter
Converter 和 Formatter 都可用于将一种对象类型转换成另一种对象类型. Converter 是通用元件,可以将一种类型转换成另一种类型,可以在应用程序中的任意层中使用: Format ...
- 【APP测试(Android)】--性能测试
- windows 性能监视器常用计数器
转载地址:https://www.jianshu.com/p/f4406c29542a?utm_campaign=maleskine&utm_content=note&utm_medi ...
- JavaScript 变量的作用域名
在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量: 'use strict'; function ...
- tensorflow nan
https://github.com/tensorflow/tensorflow/issues/3212 NaNs usually indicate something wrong with your ...
- ABP框架系列之二十一:(Domain-Services-领域服务)
Introduction Domain Services (or just Service, in DDD) is used to perform domain operations and busi ...