`
这些年
  • 浏览: 402150 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

时间对比(转)

    博客分类:
  • java
 
阅读更多
1:calender 常量
Calendar cal = Calendar.getInstance();    

//当前年     
int year = cal.get(Calendar.YEAR);    
    
//当前月 Calendar.MONTH从0开始     
int month = (cal.get(Calendar.MONTH))+1;    
    
//当前月的第几天:即当前日     
int day_of_month = cal.get(Calendar.DAY_OF_MONTH);    
//Calendar.DAY_OF_MONTH 和 Calendar.DATE 是等价的     
int date = cal.get(Calendar.DATE);    

//当前时钟:HOUR_OF_DAY-24小时制     
int hour24 = cal.get(Calendar.HOUR_OF_DAY);    
//HOUR-12小时制     
int hour12 = cal.get(Calendar.HOUR);    

//当前:分钟     
int minute = cal.get(Calendar.MINUTE);    

//当前秒     
int second = cal.get(Calendar.SECOND);    

// 星期几 Calendar.DAY_OF_WEEK用数字(1~7)表示(星期日~星期六)     
int day_of_week = cal.get(Calendar.DAY_OF_WEEK)-1;     
    
//0-上午;1-下午     
int ampm = cal.get(Calendar.AM_PM);    
    
//当前年的第几周     
int week_of_year = cal.get(Calendar.WEEK_OF_YEAR);    
     
//当前月的星期数     
int week_of_month = cal.get(Calendar.WEEK_OF_MONTH);    
    
//当前月中的第几个星期     
int day_of_week_in_month = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH);    

//当前年的第几天     
int day_of_year = cal.get(Calendar.DAY_OF_YEAR);
 2:工具类
 package com.dayatang.utils;

import java.security.InvalidParameterException;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {

	private static final long MILLIS_IN_A_SECOND = 1000;

	private static final long SECONDS_IN_A_MINUTE = 60;

	private static final long MINUTES_IN_AN_HOUR = 60;

	private static final long HOURS_IN_A_DAY = 24;

	private static final int DAYS_IN_A_WEEK = 7;

	private static final int MONTHS_IN_A_YEAR = 12;

	//private static final int[] daysInMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	/**
	 * 最小日期,设定为1000年1月1日
	 */
	public static final Date MIN_DATE = date(1000, 1, 1);

	/**
	 * 最大日期,设定为8888年1月1日
	 */
	public static final Date MAX_DATE = date(8888, 1, 1);
	

	/**
	 * 根据年月日构建日期对象。注意月份是从1开始计数的,即month为1代表1月份。
	 * @param year 年
	 * @param month 月。注意1代表1月份,依此类推。
	 * @param day 日
	 * @return
	 */
	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
	 */
	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
	 */
	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
	 */
	public static int getDayDiff(Date date1, Date date2) {
		if (date1 == null || date2 == null) {
			throw new InvalidParameterException(
					"date1 and date2 cannot be null!");
		}
		Date startDate = org.apache.commons.lang3.time.DateUtils.truncate(
				date1, Calendar.DATE);
		Date endDate = org.apache.commons.lang3.time.DateUtils.truncate(date2,
				Calendar.DATE);
		if (startDate.after(endDate)) {
			throw new InvalidParameterException("date1 cannot be after date2!");
		}
		long millSecondsInOneDay = HOURS_IN_A_DAY * MINUTES_IN_AN_HOUR
				* SECONDS_IN_A_MINUTE * MILLIS_IN_A_SECOND;
		return (int) ((endDate.getTime() - startDate.getTime()) / millSecondsInOneDay);
	}

	/**
	 * 计算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 date
	 * @return
	 */
	public static Date getPrevDay(Date date) {
		return org.apache.commons.lang3.time.DateUtils.addDays(date, -1);
	}

	/**
	 * 计算指定日期的后一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getNextDay(Date date) {
		return org.apache.commons.lang3.time.DateUtils.addDays(date, 1);
	}

	/**
	 * 判断date1是否在date2之后,忽略时间部分
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isDateAfter(Date date1, Date date2) {
		Date theDate1 = org.apache.commons.lang3.time.DateUtils.truncate(date1,
				Calendar.DATE);
		Date theDate2 = org.apache.commons.lang3.time.DateUtils.truncate(date2,
				Calendar.DATE);
		return theDate1.after(theDate2);
	}

	/**
	 * 判断date1是否在date2之前,忽略时间部分
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isDateBefore(Date date1, Date date2) {
		return isDateAfter(date2, date1);
	}

	/**
	 * 判断time1是否在time2之后,忽略日期部分
	 * 
	 * @param time1
	 * @param time2
	 * @return
	 */
	public static boolean isTimeAfter(Date time1, Date time2) {
		Calendar calendar1 = Calendar.getInstance();
		calendar1.setTime(time1);
		calendar1.set(1900, 1, 1);
		Calendar calendar2 = Calendar.getInstance();
		calendar2.setTime(time2);
		calendar2.set(1900, 1, 1);
		return calendar1.after(calendar2);
	}

	/**
	 * 判断time1是否在time2之前,忽略日期部分
	 * 
	 * @param time1
	 * @param time2
	 * @return
	 */
	public static boolean isTimeBefore(Date time1, Date time2) {
		return isTimeAfter(time2, time1);
	}

	/**
	 * 判断两个日期是否同一天(忽略时间部分)
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameDay(Date date1, Date date2) {
		return org.apache.commons.lang3.time.DateUtils.isSameDay(date1, date2);
	}

	/**
	 * 判断两个日历天是否同一天(忽略时间部分)
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameDay(Calendar date1, Calendar date2) {
		return org.apache.commons.lang3.time.DateUtils.isSameDay(date1, date2);
	}

	/**
	 * 将字符串形式的日期表示解析为日期对象
	 * 
	 * @param dateString
	 * @return
	 */
	public static Date parseDate(String dateString) {
		try {
			return org.apache.commons.lang3.time.DateUtils.parseDate(
					dateString, new String[] { "yyyy-MM-dd", "yyyy-M-d",
							"yyyy-MM-d", "yyyy-M-dd" });
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 将字符串形式的时间表示解析为日期时间对象
	 * 
	 * @param timeString
	 * @return
	 */
	public static Date parseTime(String timeString) {
		try {
			return org.apache.commons.lang3.time.DateUtils.parseDate(
					timeString, new String[] { "hh:mm:ss", "h:m:s", "hh:mm",
							"h:m" });
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 将字符串形式的日期时间表示解析为时间对象
	 * 
	 * @param timeString
	 * @return
	 */
	public static Date parseDateTime(String timeString) {
		try {
			return org.apache.commons.lang3.time.DateUtils.parseDate(
					timeString, new String[] { "yyyy-MM-dd HH:mm:ss",
							"yyyy-M-d H:m:s", "yyyy-MM-dd H:m:s",
							"yyyy-M-d HH:mm:ss" });
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 计算两个日期之间包含的星期X的天数。
	 * 
	 * @param fromDate
	 *            起始日期
	 * @param toDate
	 *            结束日期
	 * @param dayOfWeek
	 *            星期,例如星期三,星期四
	 * @return
	 */
	public static int getWeekDaysBetween(Date fromDate, Date toDate,
			int dayOfWeek) {
		int result = 0;
		Date firstDate = getFirstWeekdayBetween(fromDate, toDate, dayOfWeek);
		if (firstDate == null) {
			return 0;
		}
		Calendar aDay = Calendar.getInstance();
		aDay.setTime(firstDate);
		while (aDay.getTime().before(toDate)) {
			result++;
			aDay.add(Calendar.DATE, DAYS_IN_A_WEEK);
		}
		return result;
	}

	/**
	 * 获取在两个日期之间的第一个星期X
	 * 
	 * @param fromDate
	 *            起始日期
	 * @param toDate
	 *            结束日期
	 * @param dayOfWeek
	 *            星期,例如星期三,星期四
	 * @return
	 */
	public static Date getFirstWeekdayBetween(Date fromDate, Date toDate,
			int dayOfWeek) {
		Calendar aDay = Calendar.getInstance();
		aDay.setTime(fromDate);
		while (aDay.getTime().before(toDate)) {
			if (aDay.get(Calendar.DAY_OF_WEEK) == dayOfWeek) {
				return aDay.getTime();
			}
			aDay.add(Calendar.DATE, 1);
		}
		return null;
	}

	/**
	 * 取得参数year指定的年份的总天数
	 * 
	 * @param year
	 * @return
	 */
	public static int getDaysInYear(int year) {
		Calendar aDay = Calendar.getInstance();
		aDay.set(year, 1, 1);
		Date from = aDay.getTime();
		aDay.set(year + 1, 1, 1);
		Date to = aDay.getTime();
		return getDayDiff(from, to);
	}

	/**
	 * 取得指定年月的总天数
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	public static int getDaysInMonth(int year, int month) {
		Calendar aDay = Calendar.getInstance();
		aDay.set(year, month, 1);
		Date from = aDay.getTime();
		if (month == Calendar.DECEMBER) {
			aDay.set(year + 1, Calendar.JANUARY, 1);
		} else {
			aDay.set(year, month + 1, 1);
		}
		Date to = aDay.getTime();
		return getDayDiff(from, to);
	}

	/**
	 * 获得指定日期的年份
	 * 
	 * @param date
	 * @return
	 */
	public static int getYear(Date date) {
		return getFieldValue(date, Calendar.YEAR);
	}

	/**
	 * 获得指定日期的月份
	 * 
	 * @param date
	 * @return
	 */
	public static int getMonth(Date date) {
		return getFieldValue(date, Calendar.MONTH) + 1;
	}

	/**
	 * 获得指定日期是当年的第几天
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfYear(Date date) {
		return getFieldValue(date, Calendar.DAY_OF_YEAR);
	}

	/**
	 * 获得指定日期是当月的第几天
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfMonth(Date date) {
		return getFieldValue(date, Calendar.DAY_OF_MONTH);
	}

	/**
	 * 获得指定日期是当周的第几天
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfWeek(Date date) {
		return getFieldValue(date, Calendar.DAY_OF_WEEK);
	}

	private static int getFieldValue(Date date, int field) {
		if (date == null) {
			throw new InvalidParameterException("date cannot be null!");
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(field);
	}

	/**
	 * 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
	 * @param origDate 基准日期
	 * @param amount 时间数量
	 * @param timeUnit 时间单位,如年、月、日等。用Calendar中的常量代表
	 * @return
	 */
	public static final Date dateAfter(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
	 */
	public static final Date dateBefore(Date origDate, int amount, int timeUnit) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(origDate);
		calendar.add(timeUnit, -amount);
		return calendar.getTime();
	}
}

 时间交集

public static Map<String, Date> dateIntersec(Date start1, Date end1, Date start2, Date end2) {
		Map<String, Date> dates = new HashMap<String, Date>();
		Date start = new Date();
		Date end = new Date();
		if (start1.after(end1) || start2.after(end2)) {
			return null;
		}
		if (start1.after(end2) || start2.after(end1)) {
			return null;
		}
		if (start1.after(start2)) {
			start = start1;
		} else {
			start = start2;
		}
		if (end1.after(end2)) {
			end = end2;
		} else {
			end = end1;
		}
		dates.put("start", start);
		dates.put("end", end);
		return dates;
	}

 

分享到:
评论

相关推荐

    UTC与本地时间转换函数

    自实现的UTC时间与本地时间的转换(这里只转换成了UTC0区,要到自己的...便于对比UTC时间转换是否正确. 工具会把时间自动从UTC时间转换成年月日后进行时区校正.因此如果想要结果一致.请把系统时间(windows)调整为UTC0区.

    转动与平动的公示对比图

    ### 转动与平动的公示对比图 在物理学中,质点的直线运动和平动、刚体的定轴转动是重要的基础概念。本文将详细介绍这些运动的基本公式及其对比,帮助读者更好地理解和掌握相关知识。 #### 质点的直线运动(刚体的...

    时间域segy转深度域segy操作流程(一).doc

    ### 时间域SEGY转深度域SEGY操作流程详解 #### 一、概述 在地震勘探领域,SEGY格式是存储地震数据的一种常用标准格式。它不仅支持存储原始地震记录,还可以存储经过各种处理后的地震数据。时间域SEGY数据体是指以...

    Work1TimeDepth.rar_地震 时深转换_实际地震数据_时深转换_时深转换matlab_时间深度转换

    地震数据时深转换,深度域的模型需要转换到时间域,方便与实际时间域的地震数据进行对比

    dirctshow视频采集,可调曝光时间、对比度等参数

    在“dirctshow视频采集,可调曝光时间、对比度等参数”这个主题中,我们将深入探讨DirectShow如何用于视频采集,并且如何调整摄像头的曝光时间和对比度。 首先,`CameraDS.cpp`和`CameraDS.h`这两个文件很可能是...

    IC卡数据分析修改、对比、日期转换、28种校验计算工具

    本文将深入探讨“IC卡数据分析修改、对比、日期转换、28种校验计算工具”这一强大工具,旨在帮助用户更好地理解和运用IC卡数据处理。 首先,我们来理解一下IC卡数据分析。IC卡中的数据通常以二进制形式存储,这些...

    keil环境下 32位单片机 时间轴和RTC(年月日时分秒)互转C程序

    keil环境下 32位单片机 时间轴和RTC(年月日时分秒)互转C程序 iar环境没测试 可以用GetTick得到时间轴 再用GetRTCtime(时间轴)得到RTC时间跟写入的对比

    时间序列转监督性问题-多步式单变量函数-多步式多变量-一步式多变量-测试对比python实现-源码

    测试对比环节是验证模型效果的关键。常见的测试策略有交叉验证(如k折交叉验证)和时间序列分割(如滚动窗口或留出法),确保模型在未见过的数据上表现良好。此外,还可以通过调整窗口大小、特征选择、模型参数等来...

    动量 角动量 对比.pptx

    在动力学定律上,牛顿第二定律 F = ma 对应于转动定律 τ = Iα,动量定理 p = mvt 表示动量的变化等于力作用的时间积分,而角动量定理 L = Iωt 则表示角动量的变化等于力矩作用的时间积分。最后,机械能守恒定律...

    易语言-易语言时间对比例程

    "易语言时间对比例程"是利用易语言进行时间处理和计算的一个示例程序,旨在帮助用户理解和掌握如何在易语言中操作和管理时间数据。 时间对比在编程中是一个常见的需求,特别是在数据分析、日志记录、性能测试等领域...

    英汉主语对比与转换.pdf

    然而,英语需要明确的主语,有时用"it"作为形式主语,尤其在表达天气、时间等抽象概念时。比如"刮风了。下雨了。"在英语中用"It is raining."和"It is blowing.",这里的"it"并不是指具体的实体,而是代表了一个抽象...

    多步式单变量函数-多步式多变量-一步式单变量函数-一步式多变量-测试对比python源码(时间序列转监督性问题).zip

    多步式单变量函数-多步式多变量-一步式单变量函数-一步式多变量-测试对比python源码(时间序列转监督性问题).zip 时间序列转监督性问题 多步式单变量函数_多测多 多步式多变量_多变量一测多 一步式单变量函数_多测一 ...

    时间转换成精确的生辰八字

    5. **验证功能**:为了确保转换的正确性,项目可能包含一些测试用例,对比转换结果与预知的生辰八字是否一致。 6. **可扩展性**:考虑到命理学中还有其他相关的计算,如五行属性、四柱分析等,项目可能设计成可扩展...

    梦行PK(功能对比表生成 产品对比软件

    1. **提高决策效率**:梦行PK能够帮助用户在短时间内收集并整理出多款产品的关键信息,显著提高了决策过程的效率。 2. **增强透明度**:通过清晰的功能对比表,梦行PK增强了产品信息的透明度,让用户对每款产品的优...

    数据库与C#数据类型对比

    3. 日期时间类型对比: - C#的DateTime与数据库中的DATE或DATETIME:C#的DateTime表示日期和时间,数据库中的DATE仅包含日期,DATETIME同时包含日期和时间。 4. 布尔类型: - C#的bool与数据库中的BIT:C#的bool...

    Java占位符三种方案一起时间性能对比

    为了进行性能对比,我们可以编写一个简单的基准测试,对这三种方法进行大量重复的字符串构建操作,并测量所需的时间。测试结果可能会显示,在简单场景下,`StringBuilder` 通常更快;而在更复杂的格式化需求中,虽然...

    ctm.rar_CTM matlab_ctm_matlab 时间转换_离散 连续

    4. 分析离散模型的响应,对比与原始连续模型的差异,如波形、频谱或稳定性。 5. 调整采样频率,观察不同采样频率下离散模型的性能变化。 在MATLAB中,`c2d`函数是最常用的连续到离散转换工具,它提供了多种离散化...

    自底向上归并排序和冒泡排序时间对比

    本篇文章将详细讨论两种经典的排序算法:自底向上的归并排序(Bottom-Up Merge Sort)和冒泡排序,并通过Java实现进行时间复杂度的对比。 首先,我们来看冒泡排序。冒泡排序是一种简单的交换排序,它通过重复遍历待...

    TYPEC转HDMI扩展方案AG9310和AG9311性能参数对比.docx

    TYPEC转HDMI扩展方案AG9310和AG9311性能参数对比 TYPEC转HDMI扩展方案是近年来市场需求日益旺盛的解决方案之一,其中AG9310和AG9311是安格科技在2019年针对USB TYPE-C扩展坞和USB TYPE-CUSB扩展器市场需求下新开发...

Global site tag (gtag.js) - Google Analytics