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类进行日期加减运算,年份加减,月份加减的更多相关文章

  1. java中的Date类

    一.Date类简介 日期类主要包括Date类与Calendar类,这一节我们先介绍Date类, Date 表示特定的瞬间,精确到毫秒.Date类用于表示日期和时间,在计算机中的表示和我们现实世界使用差 ...

  2. Date类与日期格式

    Date类概述: 表示特定的瞬间,精确到毫秒. Date()分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒).Date(long date)分配 Date 对象并初始化此对象,以表 ...

  3. Java基础教程——Date类和Calendar类

    Date类和Calendar类都是关于日期的类,都在java.util包中,使用时需要import. Date java.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时 ...

  4. java基础系列--Date类

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7126930.html 1.Date类概述 Date类是从JDK1.1就开始存在的老类,其提 ...

  5. java基础之Date类

    Date类: Date类概述 类 Date 表示特定的瞬间,精确到毫秒. 构造方法 public Date() public Date(long date) 成员方法 public long getT ...

  6. Java 常用对象-Date类和Calender类

    2017-11-02 22:29:34 Date类:类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值 ...

  7. [Swift实际操作]七、常见概念-(6)日期Date和DateFormatter日期的格式化

    本文将为你演示日期类型的使用,以及如何对日期进行格式化. 首先引入需要使用到的界面框架 import UIKit 初始化一个日期对象,它的值和当前电脑中的日期相同 var date = Date() ...

  8. JAVA基础之Date类、DateFormat类及Calendar类

    个人理解: 关于Date类,进行截取或者转换时一定要注意好数据类型,long类型后面要加上L.时间的原点是1970年.用DateFormat则完成日期与文本之间的转换,特别注意的是:月是用M,时是用H ...

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

      import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; public class Da ...

随机推荐

  1. [Python] Window机器上同时安装Python 2 和 Python 3,如何兼容切换使用?

    不论python2还是python3,python可执行文件都叫python.exe,在cmd下输入python得到的版本号取决于环境变量里哪个版本的python路径更靠前. 切换的方法有3种(方法3 ...

  2. .net 简单任务调度平台安装简要说明

    .net 简单任务调度平台,用于.net dll,exe的任务的挂载,任务的隔离,调度执行,访问权限控制,监控,管理,日志,错误预警,性能分析等. 平台基于quartz.net进行任务调度功能开发,采 ...

  3. ES6最新语法

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  4. docker日志设置定期清理

    1.新建/etc/docker/daemon.json,若有就不用新建了 2.添加log-dirver和log-opts参数,样例如下 "log-driver":"jso ...

  5. kbmmw中向服务器端传递对象的一种简单方式

    运行环境:delphi 10.2+kbmmw 5.6.20 在kbmmw 的老版本中,要向服务器传送一个本地的对象,一般都需要进行一些转换,例如通过序列化的方式. 在新版的kbmmw中这一切都变的很简 ...

  6. 【转】linux 查看进程启动路径

    在linux下查看进程大家都会想到用 ps -ef|grep XXX可是看到的不是全路径,怎么看全路径呢?每个进程启动之后在 /proc下面有一个于pid对应的路径例如:ps -ef|grep pyt ...

  7. git(转载谢谢)

    Git可视化极简易教程 —— Git GUI使用方法   (新版的git默认已不能自行选择中文语言了) 前言 之前一直想一篇这样的东西,因为最初接触时,我也认真看了廖雪峰的教程,但是似乎我觉得讲得有点 ...

  8. JavaScript基础视频教程总结(001-010章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. h5移动网页唤起App

    最近这个困惑了很久,不断的有一些坑,目前还有疑问关于iOS唤起无效时会出现弹框的问题,这个最后再说 1.首先可能需要判断当前浏览器的来源(目前开发的App还没有上架,所以针对腾讯出品的大家广为人知的微 ...

  10. 桌面应用开发之WPF页面导航

    先看效果图 Get Start   为了项目解耦,使用mvvmlight框架.MVVM设计模式请自行了解. 1 新建项目   新建一个MvvmLight(WPF)项目,删除其中无关文件夹:Design ...