用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

时间工具类

2021-01-20 作者:云代码会员举报

[java]代码库

import java.math.BigDecimal;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.*;

import org.hibernate.validator.cfg.defs.MinDef;

/**
 * Description : 日期工具类
 * Author : miaozh
 * CreateTime : 2016年10月8日 下午4:38:19
 */
public class DateUtils {

	private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();

	private static final Object object = new Object();

	/**
	 * 获取SimpleDateFormat
	 * @param pattern 日期格式
	 * @return SimpleDateFormat对象
	 * @throws RuntimeException 异常:非法日期格式
	 */
	public static SimpleDateFormat getDateFormat(String pattern)
			throws RuntimeException {
		SimpleDateFormat dateFormat = threadLocal.get();
		if (dateFormat == null) {
			synchronized (object) {
				if (dateFormat == null) {
					dateFormat = new SimpleDateFormat(pattern);
					dateFormat.setLenient(false);
					threadLocal.set(dateFormat);
				}
			}
		}
		dateFormat.applyPattern(pattern);
		return dateFormat;
	}

	/**
	 * 获取日期中的某数值。如获取月份
	 * @param date 日期
	 * @param dateType 日期格式
	 * @return 数值
	 */
	private static int getInteger(Date date, int dateType) {
		int num = 0;
		Calendar calendar = Calendar.getInstance();
		if (date != null) {
			calendar.setTime(date);
			num = calendar.get(dateType);
		}
		return num;
	}

	/**
	 * 增加日期中某类型的某数值。如增加日期
	 * @param date 日期字符串
	 * @param dateType 类型
	 * @param amount 数值
	 * @return 计算后日期字符串
	 */
	private static String addInteger(String date, int dateType, int amount) {
		String dateString = null;
		DateStyle dateStyle = getDateStyle(date);
		if (dateStyle != null) {
			Date myDate = StringToDate(date, dateStyle);
			myDate = addInteger(myDate, dateType, amount);
			dateString = DateToString(myDate, dateStyle);
		}
		return dateString;
	}

	/**
	 * 增加日期中某类型的某数值。如增加日期
	 * @param date 日期
	 * @param dateType 类型
	 * @param amount 数值
	 * @return 计算后日期
	 */
	private static Date addInteger(Date date, int dateType, int amount) {
		Date myDate = null;
		if (date != null) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(date);
			calendar.add(dateType, amount);
			myDate = calendar.getTime();
		}
		return myDate;
	}

	/**
	 * 获取精确的日期
	 * @param timestamps 时间long集合
	 * @return 日期
	 */
	private static Date getAccurateDate(List<Long> timestamps) {
		Date date = null;
		long timestamp = 0;
		Map<Long, long[]> map = new HashMap<Long, long[]>();
		List<Long> absoluteValues = new ArrayList<Long>();

		if (timestamps != null && timestamps.size() > 0) {
			if (timestamps.size() > 1) {
				for (int i = 0; i < timestamps.size(); i++) {
					for (int j = i + 1; j < timestamps.size(); j++) {
						long absoluteValue = Math.abs(timestamps.get(i)
								- timestamps.get(j));
						absoluteValues.add(absoluteValue);
						long[] timestampTmp = { timestamps.get(i),
								timestamps.get(j) };
						map.put(absoluteValue, timestampTmp);
					}
				}

				// 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的。此时minAbsoluteValue为0
				// 因此不能将minAbsoluteValue取默认值0
				long minAbsoluteValue = -1;
				if (!absoluteValues.isEmpty()) {
					minAbsoluteValue = absoluteValues.get(0);
					for (int i = 1; i < absoluteValues.size(); i++) {
						if (minAbsoluteValue > absoluteValues.get(i)) {
							minAbsoluteValue = absoluteValues.get(i);
						}
					}
				}

				if (minAbsoluteValue != -1) {
					long[] timestampsLastTmp = map.get(minAbsoluteValue);

					long dateOne = timestampsLastTmp[0];
					long dateTwo = timestampsLastTmp[1];
					if (absoluteValues.size() > 1) {
						timestamp = Math.abs(dateOne) > Math.abs(dateTwo) ? dateOne
								: dateTwo;
					}
				}
			} else {
				timestamp = timestamps.get(0);
			}
		}

		if (timestamp != 0) {
			date = new Date(timestamp);
		}
		return date;
	}

	/**
	 * 根据开始时间和结束时间获取间隔的时间(单位/小时)
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static Double getIntervalHours(String startTime, String endTime){
		BigDecimal startTimeStamp = BigDecimal.valueOf(DateUtils.StringToDate(startTime, DateStyle.HH_MM_SS).getTime());
		BigDecimal endTimeStamp = BigDecimal.valueOf(DateUtils.StringToDate(endTime, DateStyle.HH_MM_SS).getTime());
		BigDecimal hours = endTimeStamp.subtract(startTimeStamp).divide(new BigDecimal(1000*60*60), 2, BigDecimal.ROUND_DOWN);
		return hours.doubleValue();
	}

	/**
	 * 判断字符串是否为日期字符串
	 * @param date 日期字符串
	 * @return true or false
	 */
	public static boolean isDate(String date) {
		boolean isDate = false;
		if (date != null) {
			if (getDateStyle(date) != null) {
				isDate = true;
			}
		}
		return isDate;
	}

	/**
	 * 获取日期字符串的日期风格。失敗返回null。
	 * @param date 日期字符串
	 * @return 日期风格
	 */
	public static DateStyle getDateStyle(String date) {
		DateStyle dateStyle = null;
		Map<Long, DateStyle> map = new HashMap<Long, DateStyle>();
		List<Long> timestamps = new ArrayList<Long>();
		for (DateStyle style : DateStyle.values()) {
			if (style.isShowOnly()) {
				continue;
			}
			Date dateTmp = null;
			if (date != null) {
				try {
					ParsePosition pos = new ParsePosition(0);
					dateTmp = getDateFormat(style.getValue()).parse(date, pos);
					if (pos.getIndex() != date.length()) {
						dateTmp = null;
					}
				} catch (Exception e) {
				}
			}
			if (dateTmp != null) {
				timestamps.add(dateTmp.getTime());
				map.put(dateTmp.getTime(), style);
			}
		}
		Date accurateDate = getAccurateDate(timestamps);
		if (accurateDate != null) {
			dateStyle = map.get(accurateDate.getTime());
		}
		return dateStyle;
	}

	/**
	 * 将日期字符串转化为日期。失败返回null。
	 * @param date 日期字符串
	 * @return 日期
	 */
	public static Date StringToDate(String date) {
		DateStyle dateStyle = getDateStyle(date);
		return StringToDate(date, dateStyle);
	}

	/**
	 * 将日期字符串转化为日期。失败返回null。
	 * @param date 日期字符串
	 * @param pattern 日期格式
	 * @return 日期
	 */
	public static Date StringToDate(String date, String pattern) {
		Date myDate = null;
		if (date != null) {
			try {
				myDate = getDateFormat(pattern).parse(date);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return myDate;
	}


	/**
	 * 将日期字符串转化为日期。失败返回null。
	 * @param date 日期字符串
	 * @param dateStyle 日期风格
	 * @return 日期
	 */
	public static Date StringToDate(String date, DateStyle dateStyle) {
		Date myDate = null;
		if (dateStyle != null) {
			myDate = StringToDate(date, dateStyle.getValue());
		}
		return myDate;
	}

	/**
	 * 将日期转化为日期字符串。失败返回null。
	 * @param date 日期
	 * @param pattern 日期格式
	 * @return 日期字符串
	 */
	public static String DateToString(Date date, String pattern) {
		String dateString = null;
		if (date != null) {
			try {
				dateString = getDateFormat(pattern).format(date);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return dateString;
	}

	/**
	 * 将日期转化为日期字符串。失败返回null。
	 * @param date 日期
	 * @param dateStyle 日期风格
	 * @return 日期字符串
	 */
	public static String DateToString(Date date, DateStyle dateStyle) {
		String dateString = null;
		if (dateStyle != null) {
			dateString = DateToString(date, dateStyle.getValue());
		}
		return dateString;
	}

	/**
	 * 将日期字符串转化为另一日期字符串。失败返回null。
	 * @param date 旧日期字符串
	 * @param newPattern 新日期格式
	 * @return 新日期字符串
	 */
	public static String StringToString(String date, String newPattern) {
		DateStyle oldDateStyle = getDateStyle(date);
		return StringToString(date, oldDateStyle, newPattern);
	}

	/**
	 * 将日期字符串转化为另一日期字符串。失败返回null。
	 * @param date 旧日期字符串
	 * @param newDateStyle 新日期风格
	 * @return 新日期字符串
	 */
	public static String StringToString(String date, DateStyle newDateStyle) {
		DateStyle oldDateStyle = getDateStyle(date);
		return StringToString(date, oldDateStyle, newDateStyle);
	}

	/**
	 * 将日期字符串转化为另一日期字符串。失败返回null。
	 * @param date 旧日期字符串
	 * @param olddPattern 旧日期格式
	 * @param newPattern 新日期格式
	 * @return 新日期字符串
	 */
	public static String StringToString(String date, String olddPattern,
			String newPattern) {
		return DateToString(StringToDate(date, olddPattern), newPattern);
	}

	/**
	 * 将日期字符串转化为另一日期字符串。失败返回null。
	 * @param date 旧日期字符串
	 * @param olddDteStyle 旧日期风格
	 * @param newParttern 新日期格式
	 * @return 新日期字符串
	 */
	public static String StringToString(String date, DateStyle olddDteStyle,
			String newParttern) {
		String dateString = null;
		if (olddDteStyle != null) {
			dateString = StringToString(date, olddDteStyle.getValue(),
					newParttern);
		}
		return dateString;
	}

	/**
	 * 将日期字符串转化为另一日期字符串。失败返回null。
	 * @param date 旧日期字符串
	 * @param olddPattern 旧日期格式
	 * @param newDateStyle 新日期风格
	 * @return 新日期字符串
	 */
	public static String StringToString(String date, String olddPattern,
			DateStyle newDateStyle) {
		String dateString = null;
		if (newDateStyle != null) {
			dateString = StringToString(date, olddPattern,
					newDateStyle.getValue());
		}
		return dateString;
	}

	/**
	 * 将日期字符串转化为另一日期字符串。失败返回null。
	 * @param date 旧日期字符串
	 * @param olddDteStyle 旧日期风格
	 * @param newDateStyle 新日期风格
	 * @return 新日期字符串
	 */
	public static String StringToString(String date, DateStyle olddDteStyle,
			DateStyle newDateStyle) {
		String dateString = null;
		if (olddDteStyle != null && newDateStyle != null) {
			dateString = StringToString(date, olddDteStyle.getValue(),
					newDateStyle.getValue());
		}
		return dateString;
	}

    /**
     * 格式化时间
     * @param date
     * @param dateStyle
     * @return 时间
     */
	public static Date dateForMat(Date date, DateStyle dateStyle){
		return StringToDate(DateToString(date, dateStyle),dateStyle);
	}

	/**
	 * 增加日期的年份。失败返回null。
	 * @param date 日期
	 * @param yearAmount 增加数量。可为负数
	 * @return 增加年份后的日期字符串
	 */
	public static String addYear(String date, int yearAmount) {
		return addInteger(date, Calendar.YEAR, yearAmount);
	}

	/**
	 * 增加日期的值。失败返回null。
	 * @param date 日期
	 * @param type 添加的类型 年、月、日、时、分、秒
	 * @param amount 增加数量
	 * @return
	 */
	public static Date add (Date date,int type ,int amount) {
		return addInteger(date, type , amount);
	}

	/**
	 * 增加日期的年份。失败返回null。
	 * @param date 日期
	 * @param yearAmount 增加数量。可为负数
	 * @return 增加年份后的日期
	 */
	public static Date addYear(Date date, int yearAmount) {
		return addInteger(date, Calendar.YEAR, yearAmount);
	}

	/**
	 * 增加日期的月份。失败返回null。
	 * @param date 日期
	 * @param monthAmount 增加数量。可为负数
	 * @return 增加月份后的日期字符串
	 */
	public static String addMonth(String date, int monthAmount) {
		return addInteger(date, Calendar.MONTH, monthAmount);
	}

	/**
	 * 增加日期的月份。失败返回null。
	 * @param date 日期
	 * @param monthAmount 增加数量。可为负数
	 * @return 增加月份后的日期
	 */
	public static Date addMonth(Date date, int monthAmount) {
		return addInteger(date, Calendar.MONTH, monthAmount);
	}

	/**
	 * 增加日期的天数。失败返回null。
	 * @param date 日期字符串
	 * @param dayAmount 增加数量。可为负数
	 * @return 增加天数后的日期字符串
	 */
	public static String addDay(String date, int dayAmount) {
		return addInteger(date, Calendar.DATE, dayAmount);
	}

	/**
	 * 增加日期的天数。失败返回null。
	 * @param date 日期
	 * @param dayAmount 增加数量。可为负数
	 * @return 增加天数后的日期
	 */
	public static Date addDay(Date date, int dayAmount) {
		return addInteger(date, Calendar.DATE, dayAmount);
	}

	/**
	 * 增加日期的小时。失败返回null。
	 * @param date 日期字符串
	 * @param hourAmount 增加数量。可为负数
	 * @return 增加小时后的日期字符串
	 */
	public static String addHour(String date, int hourAmount) {
		return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
	}

	/**
	 * 增加日期的小时。失败返回null。
	 * @param date 日期
	 * @param hourAmount 增加数量。可为负数
	 * @return 增加小时后的日期
	 */
	public static Date addHour(Date date, int hourAmount) {
		return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount);
	}

	/**
	 * 增加日期的分钟。失败返回null。
	 * @param date 日期字符串
	 * @param minuteAmount 增加数量。可为负数
	 * @return 增加分钟后的日期字符串
	 */
	public static String addMinute(String date, int minuteAmount) {
		return addInteger(date, Calendar.MINUTE, minuteAmount);
	}

	/**
	 * 增加日期的分钟。失败返回null。
	 * @param date 日期
	 * @param minuteAmount 增加数量。可为负数
	 * @return 增加分钟后的日期
	 */
	public static Date addMinute(Date date, int minuteAmount) {
		return addInteger(date, Calendar.MINUTE, minuteAmount);
	}

	/**
	 * 增加日期的秒钟。失败返回null。
	 * @param date 日期字符串
	 * @param secondAmount 增加数量。可为负数
	 * @return 增加秒钟后的日期字符串
	 */
	public static String addSecond(String date, int secondAmount) {
		return addInteger(date, Calendar.SECOND, secondAmount);
	}

	/**
	 * 增加日期的秒钟。失败返回null。
	 * @param date 日期
	 * @param secondAmount 增加数量。可为负数
	 * @return 增加秒钟后的日期
	 */
	public static Date addSecond(Date date, int secondAmount) {
		return addInteger(date, Calendar.SECOND, secondAmount);
	}

	/**
	 * 获取日期的年份。失败返回0。
	 * @param date 日期字符串
	 * @return 年份
	 */
	public static int getYear(String date) {
		return getYear(StringToDate(date));
	}

	/**
	 * 获取日期的年份。失败返回0。
	 * @param date 日期
	 * @return 年份
	 */
	public static int getYear(Date date) {
		return getInteger(date, Calendar.YEAR);
	}

	/**
	 * 获取日期的月份。失败返回0。
	 * @param date 日期字符串
	 * @return 月份
	 */
	public static int getMonth(String date) {
		return getMonth(StringToDate(date));
	}

	/**
	 * 获取日期的月份。失败返回0。
	 * @param date 日期
	 * @return 月份
	 */
	public static int getMonth(Date date) {
		return getInteger(date, Calendar.MONTH) + 1;
	}

	/**
	 * 获取日期的天数。失败返回0。
	 * @param date 日期字符串
	 * @return 天
	 */
	public static int getDay(String date) {
		return getDay(StringToDate(date));
	}

	/**
	 * 获取日期的天数。失败返回0。
	 * @param date 日期
	 * @return 天
	 */
	public static int getDay(Date date) {
		return getInteger(date, Calendar.DATE);
	}

	/**
	 * 获取日期的小时。失败返回0。
	 * @param date 日期字符串
	 * @return 小时
	 */
	public static int getHour(String date) {
		return getHour(StringToDate(date));
	}

	/**
	 * 获取日期的小时。失败返回0。
	 * @param date 日期
	 * @return 小时
	 */
	public static int getHour(Date date) {
		return getInteger(date, Calendar.HOUR_OF_DAY);
	}

	/**
	 * 获取日期的分钟。失败返回0。
	 * @param date 日期字符串
	 * @return 分钟
	 */
	public static int getMinute(String date) {
		return getMinute(StringToDate(date));
	}

	/**
	 * 获取日期的分钟。失败返回0。
	 * @param date 日期
	 * @return 分钟
	 */
	public static int getMinute(Date date) {
		return getInteger(date, Calendar.MINUTE);
	}

	/**
	 * 获取日期的秒钟。失败返回0。
	 * @param date 日期字符串
	 * @return 秒钟
	 */
	public static int getSecond(String date) {
		return getSecond(StringToDate(date));
	}

	/**
	 * 获取日期的秒钟。失败返回0。
	 * @param date 日期
	 * @return 秒钟
	 */
	public static int getSecond(Date date) {
		return getInteger(date, Calendar.SECOND);
	}

	/**
	 * 获取日期 。默认yyyy-MM-dd格式。失败返回null。
	 * @param date 日期字符串
	 * @return 日期
	 */
	public static String getDate(String date) {
		return StringToString(date, DateStyle.YYYY_MM_DD);
	}

	/**
	 * 获取日期。默认yyyy-MM-dd格式。失败返回null。
	 * @param date 日期
	 * @return 日期
	 */
	public static String getDate(Date date) {
		return DateToString(date, DateStyle.YYYY_MM_DD);
	}

	/**
	 * 获取日期的时间。默认HH:mm:ss格式。失败返回null。
	 * @param date 日期字符串
	 * @return 时间
	 */
	public static String getTime(String date) {
		return StringToString(date, DateStyle.HH_MM_SS);
	}

	/**
	 * 获取日期的时间。默认HH:mm:ss格式。失败返回null。
	 * @param date 日期
	 * @return 时间
	 */
	public static String getTime(Date date) {
		return DateToString(date, DateStyle.HH_MM_SS);
	}

	/**
	 * 获取日期的星期。失败返回null。
	 * @param date 日期字符串
	 * @return 星期
	 */
	public static Week getWeek(String date) {
		Week week = null;
		DateStyle dateStyle = getDateStyle(date);
		if (dateStyle != null) {
			Date myDate = StringToDate(date, dateStyle);
			week = getWeek(myDate);
		}
		return week;
	}

	/**
	 * 获取日期的星期。失败返回null。
	 * @param date 日期
	 * @return 星期
	 */
	public static Week getWeek(Date date) {
		Week week = null;
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		switch (weekNumber) {
		case 0:
			week = Week.SUNDAY;
			break;
		case 1:
			week = Week.MONDAY;
			break;
		case 2:
			week = Week.TUESDAY;
			break;
		case 3:
			week = Week.WEDNESDAY;
			break;
		case 4:
			week = Week.THURSDAY;
			break;
		case 5:
			week = Week.FRIDAY;
			break;
		case 6:
			week = Week.SATURDAY;
			break;
		}
		return week;
	}

	/**
	 * 获取两个日期相差的天数
	 * @param date 日期字符串
	 * @param otherDate 另一个日期字符串
	 * @return 相差天数。如果失败则返回-1
	 */
	public static int getIntervalDays(String date, String otherDate) {
		return getIntervalDays(StringToDate(date), StringToDate(otherDate));
	}

	/**
	 * @param date 日期
	 * @param otherDate 另一个日期
	 * @return 相差天数。如果失败则返回-1
	 */
	public static int getIntervalDays(Date date, Date otherDate) {
		int num = -1;
		Date dateTmp = DateUtils.StringToDate(DateUtils.getDate(date),
				DateStyle.YYYY_MM_DD);
		Date otherDateTmp = DateUtils.StringToDate(DateUtils.getDate(otherDate),
				DateStyle.YYYY_MM_DD);
		if (dateTmp != null && otherDateTmp != null) {
			long time = Math.abs(dateTmp.getTime() - otherDateTmp.getTime());
			num = (int) (time / (24 * 60 * 60 * 1000));
		}
		return num;
	}

	/**
	 * @param date 日期
	 * @param otherDate 另一个日期
	 * @return 相差分钟数。如果失败则返回-1
	 */
	public static int getIntervalMinute(Date date, Date otherDate) {
		int num = -1;
		if (date != null && otherDate != null) {
			long time = Math.abs(date.getTime() - otherDate.getTime());
			num = (int) (time / (1000*60));
		}
		return num;
	}


	/**
	 * Description :获取当前时间yyyyMMddHHmmss字符串
	 * Author : miaozh
	 * CreateTime : 2016年10月10日 下午2:43:39
	 * @return String
	 */
	public static String getSecondString() {
		return DateToString(new Date(), DateStyle.YYYYMMDDHHMMSS);
	}

	/**
	 * Description : 获取当前时间yyyyMMddHHmmssSSS字符串
	 * Author : miaozh
	 * CreateTime : 2016年10月10日 下午2:46:08
	 * @return String
	 */
	public static String getMillisecondString() {
		return DateToString(new Date(), DateStyle.YYYYMMDDHHMMSSSSS);
	}

	/**
	 * Description:[返回开始时间到结束的时间段值 例:分段计算时间值,将24小时分为48个时间段,例如:1,2标识00:00到01:00]
	 * @param startTime 开始时间9:00
	 * @param endTime 结束时间10:30
	 * @return
	 *
	 * Created on 2017/11/3
	 * @author: 尹归晋
	 */
	public static String splitTime(Date startTime, Date endTime ) {
		//开始时间
		StringBuffer splitTime = new StringBuffer();
		int startHour = DateUtils.getHour(startTime);
		int startMinute = DateUtils.getMinute(startTime);
		int startCount = startHour * 2;
		if (startMinute > 0 ) {
			startCount = startCount + 1;
		}
		//结束时间
		int endHour = DateUtils.getHour(endTime);
		int endMinute = DateUtils.getMinute(endTime);
		int endCount = endHour * 2;
		if (endMinute > 0) {
			endCount = endCount +1;
		}
		//如果结束是00:00 最后时间
		if(endHour == 0 && endMinute == 0) {
			endCount = 48;
		}
		//之所以需要++ 原因在于开始时间为9:00结束时间为9:30,不加1的情况18表示是8:30到9:00的时间段这样是错误的,我需要的是9:00到9:30的所以是19。
		startCount ++;
		endCount ++;
		//如果跨天会议  结束时间的小时小于开始时间的小时认定为跨天会议
		if(endHour < startHour) {
			for (int i = startCount;i < 49; i++) {
				splitTime.append(i);
				splitTime.append(Const.SEPARATOR_COMMA);
			}
			if (endCount != 49) {
				for (int j = 1; j < endCount; j++) {
					splitTime.append(j);
					if (j < endCount - 1) {
						splitTime.append(Const.SEPARATOR_COMMA);
					}
				}
			}
			return  splitTime.toString();
		}
		//不是跨天会议
		if (startCount == endCount) {
			splitTime.append(startCount);
			return  splitTime.toString();
		}
		for (int i = startCount;i < endCount; i++) {
			splitTime.append(i);
			if (i < endCount - 1) {
				splitTime.append(Const.SEPARATOR_COMMA);
			}
		}
		return  splitTime.toString();
	}


	/**
	 * Description:[返回开始时间到结束的时间段值 例:分段计算时间值,将24小时分为48个时间段,例如:1,2标识00:00到01:00]
	 * @param startTime 开始时间9:00
	 * @param endTime 结束时间10:30
	 * @return
	 *
	 * Created on 2017/11/3
	 * @author: 尹归晋
	 */
	public static String splitTime(String startTime, String endTime ) {
		Date startDate = DateUtils.StringToDate(startTime, DateStyle.HH_MM_SS);
		Date endDate = DateUtils.StringToDate(endTime, DateStyle.HH_MM_SS);
		return splitTime(startDate, endDate);
	}

	/**
	 * Description:[24小时分为48个时间段,根据时间段的数值获取真实的时间 -- 会议开始时间]
	 * @param number 24小时分为48个时间段的值
	 * @return 数值解析后的真实时间 -- 会议开始时间
	 *
	 * Created on 2017/11/22
	 * @author: 尹归晋
	 */
	public static Date numberByStartTime(int number) {
		int i = (number - 1) % 2;
		int hour = (number - 1) / 2;
		int minute = 0;
		if (i > 0) {
			minute = 30;
		}
		String endTime = hour + Const.SEPARATOR_COLON + minute;
		return DateUtils.StringToDate(endTime, DateStyle.HH_MM);
	}

	/**
	 * Description:[24小时分为48个时间段,根据时间段的数值获取真实的时间 -- 会议结束时间]
	 * @param number 24小时分为48个时间段的值
	 * @return 数值解析后的真实时间 -- 会议结束时间
	 *
	 * Created on 2017/11/22
	 * @author: 尹归晋
	 */
	public static Date numberByEndTime(int number) {
		return addMinute(numberByStartTime(number), 30);
	}

	/**
	 * Description:[判断两个日期是否相等]
	 * @param d1 日期1
	 * @param d2 日期2
	 * @return
	 *
	 * Created on 2017/11/3
	 * @author: 尹归晋
	 */
	public static boolean isSameDate(Date d1, Date d2) {
		if(null == d1 || null == d2)
			return false;
		//return getOnlyDate(d1).equals(getOnlyDate(d2));
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(d1);
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(d2);
		return  cal1.get(0) == cal2.get(0) && cal1.get(1) == cal2.get(1) && cal1.get(6) == cal2.get(6);
	}

	/**
	 * Description:[获取两个时间的时间差]
	 * @param date1 时间一
	 * @param date2 时间二
	 * @param type 获取的类型  天 时 分
	 * @return 时间一 减 时间二 的值
	 *
	 * Created on 2017/11/10
	 * @author: 尹归晋
	 */
	public static int dayDiff(Date date1, Date date2, int type) {
		long diff = date1.getTime() - date2.getTime();
		long nd = 1000 * 24 * 60 * 60;
		long nh = 1000 * 60 * 60;
		long nm = 1000 * 60;
		// 计算差多少天
		long day = diff / nd;
		// 计算差多少小时
		long hour = diff / nh;
		// 计算差多少分钟
		long min = diff / nm;
		if (Calendar.DATE == type) {
			return (int) day;
		} else if (Calendar.HOUR_OF_DAY == type) {
			return (int) hour;
		} else {
			return (int) min;
		}
	}

	/**
	 * Description:[根据参数时间获取前推的整点时间:列2017-11-22 17:13返回17:00;列2017-11-22 17:59返回17:30]
	 * @param date 时间
	 * @return 列2017-11-22 17:13返回17:00;列2017-11-22 17:59返回17:30
	 *
	 * Created on 2017/11/22
	 * @author: 尹归晋
	 */
	public static Date wholeHour(Date date){
		int hour = DateUtils.getHour(date);
		int minute = DateUtils.getMinute(date);
		if (minute >= 30) {
			minute = 30;
		}else {
			minute = 00;
		}
		String endTime = hour + Const.SEPARATOR_COLON + minute;
		return DateUtils.StringToDate(endTime, DateStyle.HH_MM);
	}


	/**
	 * <p>Description:[计算两个日期相差的月数,不足15天按照半个月计算,超过15天按照一个月计算]</p>
	 * Created on 2017年11月28日
	 *
	 * @param startDate 开始时间
	 * @param endDate 结束时间
	 * @return 相差的月数0.5的倍数
	 * @author 缪志红
	 */
	public static double getMonths(Date startDate, Date endDate) {
        int startYear = DateUtils.getYear(startDate);
        int endYear = DateUtils.getYear(endDate);
        int startMonth = DateUtils.getMonth(startDate);
        int endMonth = DateUtils.getMonth(endDate);
        int startDay = DateUtils.getDay(startDate);
        int endDay = DateUtils.getDay(endDate);
        int endLastDay = DateUtils.getLastDay(endDate);
        int startLastDay = DateUtils.getLastDay(startDate);
        int intervalYears = endYear - startYear;
        double intervalMonths;
        int intervalDays;
        if (intervalYears >= 1) {
            intervalDays = (startLastDay - startDay) + endDay + 1;
            intervalMonths = (12.0 - startMonth) + endMonth + 1;
			if (startDay == 1 && endDay == endLastDay) {
				intervalDays = 0;
			} else {
				if (startDay != 1) {
					intervalMonths -= 1.0;
				} else {
					intervalDays = endDay;
				}
				if (endDay != endLastDay) {
					intervalMonths -= 1.0;
				} else {
					intervalDays = startLastDay - startDay + 1;
				}
			}
        } else {
            intervalMonths = endMonth - startMonth + 1.0;
            if (intervalMonths > 1.0) {
				intervalDays = (startLastDay - startDay) + endDay + 1;
				if (startDay == 1 && endDay == endLastDay) {
					intervalDays = 0;
				} else {
					if (startDay != 1) {
						intervalMonths -= 1.0;
					} else {
						intervalDays = endDay;
					}
					if (endDay != endLastDay) {
						intervalMonths -= 1.0;
					} else {
						intervalDays = startLastDay - startDay + 1;
					}
				}
				intervalMonths = intervalMonths < 0.0 ? 0.0 : intervalMonths;
			} else {
                intervalMonths = 0.0;
                intervalDays = endDay - startDay + 1;
            }

        }
		if (intervalDays == 0) {
			intervalMonths += 0.0;
		} else if (intervalDays <= 15) {
            intervalMonths += 0.5;
        } else if (intervalDays >= 31) {
            intervalMonths += 1.0;
            if (intervalDays - 31 > 15) {
                intervalMonths += 1.0;
            } else if (intervalDays - 31 >= 1) {
                intervalMonths += 0.5;
            }
        } else {
            intervalMonths += 1.0;
        }
        for (int i = 1; i < intervalYears; i++) {
            intervalMonths += 12.0;
        }
        return intervalMonths;
    }



	/**
	 * <p>Description:[计算当前时间所处的拆分时间段]</p>
	 * Created on 2017年12月05日
	 *
	 * @return 拆分时间段Integer值
	 * @author 缪志红
	 */
	public static Integer getSplitTimeByNow() {
		int hour = DateUtils.getHour(new Date());
		int minute = DateUtils.getMinute(new Date());
		int splitTime = hour * 2 + 1;
		if (minute >= 30) {
			splitTime += 1;
		}
		return splitTime;
	}

	/**
	 * <p>Description:[计算时间所处的拆分时间段]</p>
	 * Created on 2018年1月14日
	 *
	 * @return 拆分时间段Integer值
	 * @author 缪志红
	 */
	public static Integer getSplitTime(Date date) {
		int hour = DateUtils.getHour(date);
		int minute = DateUtils.getMinute(date);
		if (minute > 0 && minute < 30) {
			minute = 30;
		}
		int splitTime = hour * 2 + 1;
		if (minute >= 30) {
			splitTime += 1;
		}
		return splitTime;
	}

	/**
	 * Description:[获取当前月的第一天的日期]
	 * @return 当前月第一天
	 *
	 * Created on 2017/12/15
	 * @author: 尹归晋
	 */
	public static Date getfirstDate(){
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
		return StringToDate(getDateFormat(DateStyle.YYYY_MM_DD.getValue()).format(c.getTime()));
	}

	/**
	 * Description:[获取当前月的最后一天的日期]
	 * @return 当前月的最后一天
	 *
	 * Created on 2017/12/15
	 * @author: 尹归晋
	 */
	public static Date getlastDate(){
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
		return StringToDate(getDateFormat(DateStyle.YYYY_MM_DD.getValue()).format(c.getTime()));
	}

	/**
	 * Description:[获取指定月的最后一天的日期]
	 * @return 指定的最后一天
	 *
	 * Created on 2017/12/15
	 * @author: 李瑞丰
	 */
	public static int getLastDay(Date date){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
		return lastDay;
	}

	/**
	 * Description:[获取指定月的第一天的日期]
	 * @return 指定的第一天
	 *
	 * Created on 2017/12/15
	 * @author: 李瑞丰
	 */
	public static int getFirstDay(Date date){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int firstDay = c.getActualMinimum(Calendar.DAY_OF_MONTH);
		return firstDay;
	}

	/**
	 * <p>Description:[获取当前日期字符串]</p>
	 * Created on 2018/1/2
	 *
	 * @author 缪志红
	 */
	public static String getCurrentDateString() {
		return DateToString(new Date(), DateStyle.YYYY_MM_DD);
	}

	/**
	 * <p>Description:[获取当前日期]</p>
	 * Created on 2018/1/2
	 *
	 * @author 缪志红
	 */
	public static Date getCurrentDate() {
		return StringToDate(getCurrentDateString(), DateStyle.YYYY_MM_DD);
	}


	/**
	 * <p>Description:[时间是否小于当前时间 ]</p>
	 * Created on 2017年12月26日
	 * @param targetDate 目标日期
	 * @param targetTime 目标时间
	 * @return
	 * @author:[刘香平]
	 */
	public static boolean compareNowHours(Date targetDate, Date targetTime){
		Date date = new Date();
		if (targetDate.after(date)) {
			return false;
		}
		Date nowTime = DateUtils.StringToDate(DateUtils.getHour(date) + Const.SEPARATOR_COLON + DateUtils.getMinute(date) + Const.SEPARATOR_COLON + DateUtils.getSecond(date), DateStyle.HH_MM_SS);
		int compare = nowTime.compareTo(targetTime);
		if (compare >= 0) {
			return true;
		}else {
			return false;
		}
	}

	/**
	 * <p>Description:[获取申请展厅时间列表]</p>
	 * Created on 2018/7/27
	 *
	 * @author 缪志红
	 */
	public static List<String> getTimeList() {
		List<String> timeList = new ArrayList<>();
		timeList.add("10:00");
		timeList.add("10:30");
		timeList.add("11:00");
		timeList.add("11:30");
		timeList.add("12:00");
		timeList.add("12:30");
		timeList.add("13:00");
		timeList.add("13:30");
		timeList.add("14:00");
		timeList.add("14:30");
		timeList.add("15:00");
		timeList.add("15:30");
		timeList.add("16:00");
		timeList.add("16:30");
		timeList.add("17:00");
		timeList.add("17:30");
		return timeList;
	}

	/**
	 * <p>Description:[获取一天中所有的拆分时间]</p>
	 * Created on 2018/7/27
	 *
	 * @author 缪志红
	 */
	public static List<Integer> getAllSplitTimes() {
		List<Integer> splitTimes = new ArrayList<>();
		for (int i = 0; i < 48; i++) {
			splitTimes.add(i + 1);
		}
		return splitTimes;
	}

	/**
	 * <p>Description:[获取某月最大日期]</p>
	 * Created on 2018/7/31
	 *
	 * @author 缪志红
	 */
	public static int getMonthMaxDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(getYear(date), getMonth(date) - 1, 1);
		return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * <p>Description:[获取零点的时间]</p>
	 * Created on 2018/8/3
	 *
	 * @author 缪志红
	 */
	public static Date getZeroTimeDate() {
		return StringToDate("00:00:00", DateStyle.HH_MM);
	}
	
	/**
	 * <p>Description:[获取当天23点59分59秒的时间]</p>
	 * Created on 2018/8/3
	 *
	 * @author 缪志红
	 */
	public static Date getEndTimeDate() {
		Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE,59);
        calendar.set(Calendar.SECOND, 59);
		return calendar.getTime();
	}

	/**
	 * <p>Description:[获取当前时间]</p>
	 * Created on 2018/8/16
	 *
	 * @author 缪志红
	 */
	public static Date getCurrentTime() {
		return dateForMat(new Date(), DateStyle.HH_MM);
	}

	/**
	 * <p>Description:[根据int值获取星期值]</p>
	 * Created on 2018/8/31
	 *
	 * @author 缪志红
	 */
	public static String week(int day) {
		String week = "";
		switch (day) {
			case 1:
				week = "星期天";
				break;
			case 2:
				week = "星期一";
				break;
			case 3:
				week = "星期二";
				break;
			case 4:
				week = "星期三";
				break;
			case 5:
				week = "星期四";
				break;
			case 6:
				week = "星期五";
				break;
			case 7:
				week = "星期六";
				break;
		}
		return week;
	}

	public static void main(String[] args) {
		System.out.println(getSplitTime(StringToDate("08:30", DateStyle.HH_MM)));
	}

	/**
	 * <p>Discription:[根据传入的两个时间计算相差几个小时,结果保留一位小数]</p>
	 * Created on 2018年09月03日17:21:23
	 * @param dateLast date类型的时间1
	 * @param dateNext date类型的时间2
	 * @return Double 返回保留一位小数的绝对值
	 * @author:[石雄朵]
	 */
	public static Double calculateHour(Date dateLast, Date dateNext) {
		long millisLast = dateLast.getTime();
		long millisNext = dateNext.getTime();
		double differenceMillis = millisNext - millisLast;
		double hourDouble = differenceMillis/1000/60/60;
		BigDecimal decHour = new BigDecimal(hourDouble);
		hourDouble = decHour.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
		return Math.abs(hourDouble);
	}
	/**
	 * 判断是否今天
	 * @param ts
	 * @return
	 */
	public static boolean isToday(long ts) {
        LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.of(0, 0, 0));
        LocalDateTime tommorrow = today.plusDays(1);
        long todaySecond = today.atZone(ZoneId.systemDefault()).toEpochSecond();
        long tomorrowSeconds = tommorrow.atZone(ZoneId.systemDefault()).toEpochSecond();
        ts = ts/1000;
        return ts >= todaySecond && ts < tomorrowSeconds;
    }
	/**
	 * 分钟差
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static long minuteDiff(Date startTime,Date endTime) {
		   long l=endTime.getTime()-startTime.getTime();
		   long min=((l/(60*1000)));
		   return min;
	}
}


分享到:
更多

网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。