DateUtil 工具类 3.2.1

7 篇文章 0 订阅
本文详细介绍了Java中的DateUtil工具类,包括其核心功能、常见用法以及如何在实际项目中有效利用该工具类进行日期时间操作,帮助开发者提高效率。
摘要由CSDN通过智能技术生成
package util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import org.apache.commons.lang.time.DateUtils;
 
/**
 * @author wanglf
 * @version 3.2.1
 * @Package com.jfai.kg.kafkacomsu.util
 * @Description: Java日期工具类 (注:本工具类默认异常全抛)
 * @date 2018年6月30日14:43:25
 * @Attention:
     * 北京时间, China Standard Time,中国标准时间 缩写CST
     * 格林尼治标准时间,Greenwich Mean Time,缩写 GMT,是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间.
     * 由于地球在它的椭圆轨道里的运动速度不均匀,所以GMT可能与实际的太阳时有误差,最大误差达16分钟。
     * 现在的标准时间,是由原子钟报时的协调世界时(UTC).
     * 世界标准时间,Universal Time Coordinated,缩写 UTC.现在最主要的世界时间标准
     * 夏令时,Daylight Saving time,缩写 DST
 * @detail
     * 比上一个版本功能增强.. 2018年7月1日 10:23:11
     * getsomeTimes升级为getSpecificTime  新增时分秒调整 2018年7月6日09:23:43
     * 新增毫秒值转date类型,以及毫秒值转时间字符串 2018年7月13日09:23:46
     * 引入Calendar类 2018年7月19日09:23:58
     * 新增依据毫秒值获取当前时延的功能  2018年7月21日09:23:05
     * 新增transMills方法,可以将formatTime方法转出来的字符串还原回毫秒值(经测试无误,ok-~) 2018年7月25日17:11:23
     * 新增依据日期获取毫秒值的相应方法  2018年7月26日17:51:34
     * 新增时间戳相关功能 2018年8月1日14:00:37
     * 新增依据Date获取时分秒毫秒及星期值功能 2018年8月3日09:25:43
     * 新增Timezone和周,天在全年中的获取方法 2018年8月3日16:04:44
     * 新增季度天数首尾获取方法  2018年8月5日12:11:09
     * 新增java.sql.Date和java.util.Date之间的转化方法 2018年8月11日18:05:03
     * 新增依据格式化字符串,获取当前时间字符串的功能 2018年8月18日15:02:59
     * 更新默认format的获取方法,为每个线程分配一个默认的format,避免多线程的并发竞争 2018年8月22日17:52:00
     * 新增Date之间的毫秒绝对值之差的计算方法 2018年12月18日15:40:13
 * @remark
     * 在Java 8中日期时间功能中,时区使用的是java.time.ZoneId类
     * getOffset(time)方法返回的是以毫秒为单位的,与世界标准时间UTC为time的时差
     * timeZone(如此段代码若在上海时区运行,将返回28800,000,即正好8个小时,符合预期中国UTC+8的时区)
     * TimeZone.getAvailableIDs(),可以列出TimeZone中所有可用的时区ID
     * 
     * 
 */
public class DateUtil {
 
	public static final String DEFAULT_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";
	public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd";
	public static final String CHINA_FORMAT_PATTERN = "yyyy年MM月dd日";
	public static final String TIME_FORMAT_PATTERN = "HH:mm:ss";
	public static final String ORDER_FORMAT_PATTERN = "yyyyMMddHHmmss";
	public static final String LOGGER_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss:SSS";
	public static final String TIMESTAMP_FORMAT_PATTERN = "yyyyMMddHHmmssSSS";
	public static final String WEEKDAY_FORMAT_PATTERN = "yyyy年MM月dd日 HH时mm分ss秒 EEEE";
 
	public static final String CHINA_FORMAT_PATTERN_EX = "yyyy年MM月dd日 HH时mm分ss秒";
	// 说明:使用ThreadLocal, 也是将共享变量变为线程独享,线程独享一般肯定比方法独享在并发环境中更能减少不少创建对象的开销的
	// 如果对性能要求比较高的情况下,一般推荐使用
	private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		}
	};
 
	public static SimpleDateFormat format = threadLocal.get();
	// public static SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd
	// HH:mm:ss");
	
	/**
	 * 返回一个SimpleDateFormat("yyyy-MM-dd HH:mm:ss")对象
	 * @return
	 * @version 1.0.0
	 */
	public static SimpleDateFormat getDefaultFormat() {
		if (threadLocal.get() != null) {
			return threadLocal.get();
		} else {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			threadLocal.set(format);
			return format;
		}
	}
 
	/**
	 * 获得当前时间,返回格式为yyyy-MM-dd HH:mm:ss
	 */
	public static String getCurrentTimeString() {
		return format.format(Calendar.getInstance().getTime());
	}
 
	/**
	 * 以yyyy-MM-dd HH:mm:ss格式,返回当前时间字符串
	 */
	public static String getDateString() {
		return getCurrentTimeString();
	}
 
	/**
	 * 返回格式  yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateString(Date date) {
		return format.format(date);
	}
 
	/**
	 * 以制定的格式返回当前日期的日期字符串
	 */
	public static String getDateString(String dateFormatStr) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormatStr);
		return sdf.format(Calendar.getInstance().getTime());
	}
 
	/**
	 * 返回指定格式的时间字符串
	 */
	public static String getDateString(Date date, String dateFormatStr) {
		SimpleDateFormat f = new SimpleDateFormat(dateFormatStr);
		return f.format(date);
	}
 
	/**
	 * 以yyyy-MM-dd HH:mm:ss格式,返回毫秒值转成的时间字符串
	 */
	public static String getDateString(Long mill) {
		Date date = Calendar.getInstance().getTime();
		date.setTime(mill);
		return format.format(date);
	}
 
	/**
	 * 以指定的格式,返回毫秒值转成的时间字符串
	 */
	public static String getDateString(Long mill, String dateFormatStr) {
		SimpleDateFormat f = new SimpleDateFormat(dateFormatStr);
		Date date = Calendar.getInstance().getTime();
		date.setTime(mill);
		return f.format(date);
	}
 
	/**
	 * 获取当前日期时间
	 *
	 * @return Date
	 */
	public static Date getDate() {
		return Calendar.getInstance().getTime();
	}
 
	/**
	 * 依据毫秒值获取时间
	 */
	public static Date getDate(Long millis) {
		Date date = Calendar.getInstance().getTime();
		date.setTime(millis);
		return date;
	}
 
	/**
	 * 依据sql.Date获取util.Date
	 */
	public static Date getDate(java.sql.Date sqlDate) {
		return new Date(sqlDate.getTime());
	}
 
	/**
	 * 依据传入的日期字符串返回相应的Date时间类型,传入时间格式为默认的yyyy-MM-dd HH:mm:ss格式
	 *
	 * @param dateString 传入的日期字符串
	 * @return java.util.Date
	 * @throws ParseException
	 */
	public static Date getDate(String dateString) throws ParseException {
		return format.parse(dateString);
	}
 
	/**
	 * 依据传入的日期字符串和日期格式化字符串返回相应的Date时间类型(注:默认为java.util.Date)
	 *
	 * @param dateString    传入的日期字符串
	 * @param dateFormatStr 日期格式化字符串
	 * @return java.util.Date
	 * @throws ParseException
	 */
	public static Date getDate(String dateString, String dateFormatStr) throws ParseException {
		SimpleDateFormat f = new SimpleDateFormat(dateFormatStr);
		return f.parse(dateString);
	}
 
	/**
	 * 获取java.sql.Date
	 */
	public static java.sql.Date getsSqlDate() {
		return new java.sql.Date(System.currentTimeMillis());
	}
 
	/**
	 * 获取java.sql.Date,依据传入的java.util.Date
	 *
	 * @param date java.util.Date
	 * @return ava.sql.Date
	 * @version 1.0.0
	 */
	public static java.sql.Date getsSqlDate(java.util.Date date) {
		return new java.sql.Date(date.getTime());
	}
 
	/**
	 * 使用默认的日期格式化字符串格式化,格式传入的时间字符串,返回java.util.Date时间类型
	 *
	 * @param dateStr
	 * @return java.util.Date时间类型
	 * @throws ParseException
	 */
	public static Date getDateFromDateStr(String dateStr) throws ParseException {
		return format.parse(dateStr);
	}
 
	/**
	 * 依据传入的日期字符串和日期格式化字符串返回相应的Date时间类型(注:默认为java.util.Date)
	 *
	 * @param dateStr       传入的日期字符串
	 * @param dateFormatStr 日期格式化字符串
	 * @return java.util.Date
	 * @throws ParseException
	 */
	public static Date getDateFromDateStr(String dateStr, String dateFormatStr) throws ParseException {
		SimpleDateFormat f = new SimpleDateFormat(dateFormatStr);
		return f.parse(dateStr);
	}
 
	/**
	 * 获取时间戳,默认为yyyyMMddHHmmssSSS格式,如20180801113148243
	 *
	 * @return 时间戳字符串
	 */
	public static String getTimestamp() {
		SimpleDateFormat f = new SimpleDateFormat(TIMESTAMP_FORMAT_PATTERN);
		return f.format(Calendar.getInstance().getTime());
	}
 
	/**
	 * 依据传入的日期格式化字符串,获取相应的时间戳
	 *
	 * @param dateFormatStr 日期格式化字符串
	 * @return 时间戳字符串
	 */
	public static String getTimestamp(String dateFormatStr) {
		SimpleDateFormat f = new SimpleDateFormat(dateFormatStr);
		return f.format(Calendar.getInstance().getTime());
	}
 
	/**
	 * 获取昨天此时的时间
	 *
	 * @return 昨天此时的日期 java.util.Date
	 */
	public static Date getYesterday() {
		Calendar cale = Calendar.getInstance();
		cale.add(Calendar.DATE, -1);
		return cale.getTime();
	}
 
	/**
	 * 取得昨天此时的时间
	 *
	 * @return 昨天此时的日期 java.util.Date
	 */
	public static Date getYesterdayDate() {
		return new Date(getMills() - 0x5265c00L);
	}
 
	/**
	 * 取得去过i天的时间
	 *
	 * @param i 过去时间天数
	 * @return 过去i天的日期 java.util.Date
	 */
	public static Date getPastdayDate(int i) {
		return new Date(getMills() - 0x5265c00L * i);
	}
 
	/**
	 * 返回年份
	 *
	 * @param date java.util.Date
	 * @return 正常为4位数的年数
	 */
	public static Integer getYear(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
		String year = formatter.format(date);
		return Integer.parseInt(year);
	}
 
	/**
	 * 返回月份
	 *
	 * @param date java.util.Date
	 * @return 月数
	 */
	public static Integer getMonth(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("MM");
		String month = formatter.format(date);
		return Integer.parseInt(month);
	}
 
	/**
	 * 返回天数
	 *
	 * @param date java.util.Date
	 * @return 当月的天数
	 */
	public static Integer getDay(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("dd");
		String day = formatter.format(date);
		return Integer.parseInt(day);
	}
 
	/**
	 * 返回小时数(24小时制)
	 *
	 * @param date java.util.Date
	 * @return 24小时的小时数
	 */
	public static Integer getHours(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("HH");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 返回该日期的分钟值
	 *
	 * @param date java.util.Date
	 * @return 分钟数
	 */
	public static Integer getMinutes(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("HH");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 该日期的秒值
	 *
	 * @param date java.util.Date
	 * @return 秒值
	 */
	public static Integer getSeconds(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("ss");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 该日期的当前毫秒值
	 *
	 * @param date java.util.Date
	 * @return 该日期的当前毫秒值0-999
	 */
	public static Integer getMillsInThisSecond(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("SSS");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 获取该日期在一年中的天数
	 *
	 * @param date java.util.Date
	 * @return 一年中的天数
	 */
	public static Integer getdayOfYear(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("D");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 获取该日期在一年中的周数
	 *
	 * @param date
	 * @return 该日期在一年中的第几周
	 */
	public static Integer getWeekOfYear(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("w");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 该日期在月份中的周数
	 *
	 * @param date
	 * @return 该日期在是其当前月中的第几周
	 */
	public static Integer getWeekOfMonth(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("W");
		return Integer.parseInt(formatter.format(date));
	}
 
	/**
	 * 返回该日期的星期数
	 *
	 * @param date java.util.Date
	 * @return Integer之星期数, 如 星期五 返回5
	 */
	public static Integer getWeek(Date date) {
		Calendar instance = Calendar.getInstance();
		instance.setTime(date);
		return instance.get(Calendar.DAY_OF_WEEK) - 1;
	}
 
	/**
	 * 获得当前月的第一天,返回格式为yyyy-MM-dd HH:mm:ss
	 *
	 * @return 格式化后的时间字符串
	 */
	public static String getFirstDayOfMonth() {
		Calendar cale = Calendar.getInstance();
		cale.set(Calendar.DAY_OF_MONTH, 1);
		return format.format(cale.getTime());
	}
 
	/**
	 * 获得当前月的最后一天,返回格式为yyyy-MM-dd HH:mm:ss
	 *
	 * @return 格式化后的时间字符串
	 */
	public static String getLastDayOfMonth() {
		Calendar cale = Calendar.getInstance();
		cale.add(Calendar.MONTH, 1);
		cale.set(Calendar.DAY_OF_MONTH, 0);
		return format.format(cale.getTime());
	}
 
	/**
	 * 获得下个月的第一天,返回格式为yyyy-MM-dd HH:mm:ss
	 *
	 * @return 格式化后的时间字符串
	 */
	public static String getFirstDayOfNextMonth() {
		Calendar cale = Calendar.getInstance();
		cale.add(Calendar.MONTH, 1);
		cale.set(Calendar.DAY_OF_MONTH, 1);
		return format.format(cale.getTime());
	}
 
	/**
	 * 获取本周周一的日期,返回yyyy-MM-dd的日期格式字符串
	 *
	 * @return yyyy-MM-dd格式的日期字符串
	 */
	@SuppressWarnings("static-access")
	public static String getMondayOFCurrentWeek() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(calendar.DAY_OF_MONTH, 1 - calendar.DAY_OF_WEEK);
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_PATTERN);
		return sdf.format(calendar.getTime());
	}
 
	/**
	 * 获取本周周日的日期,返回yyyy-MM-dd的日期格式字符串
	 *
	 * @return yyyy-MM-dd格式的日期字符串
	 */
	@SuppressWarnings("static-access")
	public static String getWeekdayOfCurrentWeek() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(calendar.DAY_OF_MONTH, 7 - calendar.DAY_OF_WEEK);
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_PATTERN);
		return sdf.format(calendar.getTime());
	}
 
	/**
	 * 获取本季度第一天
	 *
	 * @return 本季度第一天, yyyy-MM-dd格式的日期字符串
	 * @Attention 中国以现阳历3, 4, 5月份为春季, 6, 7, 8月份为夏季, 9, 10, 11月份为秋季, 12, 1, 2月份为冬季
	 */
	@SuppressWarnings("static-access")
	public static String getSeasonFirstDay() {
		Calendar calendar = Calendar.getInstance();
		int month = calendar.get(2) + 1;
		if (month >= 3 && month <= 5) {
			calendar.set(calendar.MONTH, 3 - 1);
		}
		if (month >= 6 && month <= 8) {
			calendar.set(calendar.MONTH, 6 - 1);
		}
		if (month >= 9 && month <= 11) {
			calendar.set(calendar.MONTH, 9 - 1);
		}
		if (month == 12 && month <= 2) {
			calendar.set(calendar.MONTH, 12 - 1);
		}
		calendar.set(calendar.DAY_OF_MONTH, 1);
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_PATTERN);
		return sdf.format(calendar.getTime());
	}
 
	/**
	 * 获取本季度最后一天,返回yyyy-MM-dd格式的日期字符串
	 *
	 * @return 本季度最后一天, yyyy-MM-dd格式的日期字符串
	 * @Attention 中国以现阳历3, 4, 5月份为春季, 6, 7, 8月份为夏季, 9, 10, 11月份为秋季, 12, 1, 2月份为冬季
	 */
	@SuppressWarnings("static-access")
	public static String getSeasonLastDay() {
		Calendar calendar = Calendar.getInstance();
		int month = calendar.get(2) + 1;
		if (month >= 3 && month <= 5) {
			calendar.set(calendar.MONTH, 5 - 1);
		}
		if (month >= 6 && month <= 8) {
			calendar.set(calendar.MONTH, 8 - 1);
		}
		if (month >= 9 && month <= 11) {
			calendar.set(calendar.MONTH, 11 - 1);
		}
		if (month == 12 && month <= 2) {
			calendar.set(calendar.MONTH, 2 - 1);
		}
		calendar.set(calendar.DAY_OF_MONTH, 1);
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_PATTERN);
		return sdf.format(calendar.getTime());
	}
 
	/**
	 * 获取两个日期之间间隔天数
	 *
	 * @param date1 java.util.Date
	 * @param date2 java.util.Date
	 * @return 两个日期之间相隔的天数
	 * @Attention 返回的是绝对值, 所以两个日期可以不分先后
	 */
	public static int getIntevalDays(Date date1, Date date2) {
		Integer t1 = getdayOfYear(date1);
		Integer t2 = getdayOfYear(date2);
		return Math.abs(t1 - t2);
	}
 
	/**
	 * 获得半年后的日期
	 *
	 * @return 半年后的日期
	 */
	public static Date getDateAfterHalfYear() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 6);
		return calendar.getTime();
	}
 
	/**
	 * 获取当前程序所在时区
	 *
	 * @return "CST+0800 中国标准时间"
	 * @remark 传说这是中国标准时间:China Standard Time UT+8:00
	 * CST可视为美国,澳大利亚,古巴或中国的标准时间
	 */
	public static String getTimezone() {
		//return TimeZone.getDefault().toString();
		return "CST+0800 中国标准时间";
	}
 
	/**
	 * 获取传入日期的时区
	 *
	 * @param date
	 * @return
	 */
	public static String getTimezone(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("zZ zzzz");
		return sdf.format(date);
	}
 
	/**
	 * 得到当前星期数
	 *
	 * @return 当前的星期数
	 */
	public static int getCurrentWeekDay() {
		return Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1;
	}
 
	// 依据传入的月数,返回该月有多少天
	//
 
	/**
	 * 获取系统当前时间的上几天/周/月/年或者以后几天/周/月/年的时间
	 *
	 * @param type          :1 天  2 周 3 月 4 年    5 时 6分 7秒
	 * @param count:-1      上一   1   下一   -2   上二     2   下二...
	 * @param dateFormatStr :返回的时间样式,如:yyyy-MM-dd hh:mm:ss
	 */
	public static String getSpecificTime(int type, int count, String dateFormatStr) {
		Date date = null;
		Calendar curr = Calendar.getInstance();
		switch (type) {
		case 1:
			curr.set(Calendar.DAY_OF_MONTH, curr.get(Calendar.DAY_OF_MONTH) + count);
			date = curr.getTime();
			break;
		case 2:
			curr.set(Calendar.DAY_OF_MONTH, curr.get(Calendar.DAY_OF_MONTH) + 7 * count);
			date = curr.getTime();
			break;
		case 3:
			curr.set(Calendar.MONTH, curr.get(Calendar.MONTH) + count);
			date = curr.getTime();
			break;
		case 4:
			curr.set(Calendar.YEAR, curr.get(Calendar.YEAR) + count);
			date = curr.getTime();
			break;
		case 5:
			curr.set(Calendar.HOUR_OF_DAY, curr.get(Calendar.HOUR_OF_DAY) + count);
			date = curr.getTime();
			break;
		case 6:
			curr.set(Calendar.MINUTE, curr.get(Calendar.MINUTE) + count);
			date = curr.getTime();
			break;
		case 7:
			curr.set(Calendar.SECOND, curr.get(Calendar.SECOND) + count);
			date = curr.getTime();
			break;
		default:
			break;
		}
		SimpleDateFormat f = new SimpleDateFormat(dateFormatStr);
		return f.format(date);
	}
 
	/**
	 * 返回当前的的毫秒值(注意是java时间的毫秒值)
	 *
	 * @return 毫秒值
	 */
	public static Long getMills() {
		return System.currentTimeMillis();
	}
 
	/**
	 * 依据传入的日期对象,返回相应的毫秒值
	 *
	 * @param date java.util.Date对象
	 * @return 该日期对象相应的毫秒值
	 * @version 1.0.0
	 * @Attention 注意是java时间的毫秒值
	 */
	public static Long getMills(java.util.Date date) {
		return date.getTime();
	}
 
	/**
	 * 依据传入的传入的两个日期对象,返回相应的毫秒绝对值之差
	 *
	 * @param date java.util.Date对象
	 * @return 该日期对象相应的毫秒值
	 * @version 1.0.0
	 * @Attention 返回的是两个java时间的毫秒绝对值之差
	 */
	public static Long getMills(java.util.Date date1,java.util.Date date2) {
		return Math.abs(date1.getTime()-date2.getTime());
	}
	
	/**
	 * 依据传入的日期字符串获取相应的毫秒值
	 * 默认传入的字符串格式 yyyy-MM-dd HH:mm:ss
	 *
	 * @param dateStr 传入的日期字符串
	 * @return 毫秒值
	 * @throws ParseException
	 */
	public static Long getMills(String dateStr) throws ParseException {
		Date date = format.parse(dateStr);
		Calendar curr = Calendar.getInstance();
		curr.setTime(date);
		return curr.getTimeInMillis();
	}
 
	/**
	 * 依据传入的日期字符串和日期格式化字符串获取相应的毫秒值
	 * formatStr 备选值有DateUtil类里的常量
	 *
	 * @throws ParseException
	 */
	public static Long getMills(String dateStr, String formatStr) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
		Date date = sdf.parse(dateStr);
		Calendar curr = Calendar.getInstance();
		curr.setTime(date);
		return curr.getTimeInMillis();
 
	}
 
	/**
	 * 获取当前的纳秒值
	 */
	public static Long getNanosecond() {
		return System.nanoTime();
	}
 
	/**
	 * 依据传入的毫秒值,获取当前时延
	 */
	public static String getDelayTime(Long mills) {
		return formatMills(System.currentTimeMillis() - mills);
	}
 
	/**
	 * 依据传入的毫秒值,获取当前时延
	 */
	public static String getDelayTime(String mills) {
		long ms = Long.parseLong(mills);
		return formatMills(System.currentTimeMillis() - ms);
	}
 
	/**
	 * 将传入的毫秒值转化时分秒毫秒得形式
	 *
	 * @param ms 毫秒值   注:支持毫秒值为负数 的情况
	 * @return 转化而来的时分秒毫秒字符串
	 * @version 2.0.0
	 */
	public static String formatMills(Long ms) {
		if (ms == 0L) {
			return "0毫秒";
		}
 
		boolean isPlus = true;
		if (ms < 0L) {
			isPlus = false;
			ms = Math.abs(ms);
		}
 
		Long ss = 1000L;
		Long mi = ss * 60;
		Long hh = mi * 60;
		Long dd = hh * 24;
 
		Long day = ms / dd;
		Long hour = (ms - day * dd) / hh;
		Long minute = (ms - day * dd - hour * hh) / mi;
		Long second = (ms - day * dd - hour * hh - minute * mi) / ss;
		Long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;
 
		StringBuffer sb = new StringBuffer();
		if (day > 0) {
			sb.append(day + "天");
		}
		if (hour > 0) {
			sb.append(hour + "小时");
		}
		if (minute > 0) {
			sb.append(minute + "分");
		}
		if (second > 0) {
			sb.append(second + "秒");
		}
		if (milliSecond > 0) {
			sb.append(milliSecond + "毫秒");
		}
		return isPlus == false ? "-" + sb.toString() : sb.toString();
	}
 
	/**
	 * 将formatMills转出来的字符串,如**天**小时**分**秒**毫秒,还原回毫秒值
	 *
	 * @param str formatTime转出来的字符串
	 * @return 转化而来的毫秒值
	 * @Attention 如果返回0, 可能是参数有问题, 注意检查参数~
	 */
	public static Long transMills(String str) {
		if (isNull(str)) {
			return 0L;
		}
		boolean isPlus = true;
		if (str.charAt(0) == '-') {
			isPlus = false;
		}
		String reg = "^[-?](?:(\\d*)天){0,1}(?:(\\d.*?)小时){0,1}(?:(\\d*)分){0,1}(?:(\\d*)秒){0,1}(?:(\\d*)毫秒){0,1}$";
		Pattern p = Pattern.compile(reg);
		Matcher m = p.matcher(str);
		if (m.find()) {
			long day = Long.parseLong(m.group(1) == null ? 0 + "" : m.group(1));
			long hour = Long.parseLong(m.group(2) == null ? 0 + "" : m.group(2));
			long min = Long.parseLong(m.group(3) == null ? 0 + "" : m.group(3));
			long sec = Long.parseLong(m.group(4) == null ? 0 + "" : m.group(4));
			long mill = Long.parseLong(m.group(5) == null ? 0 + "" : m.group(5));
			Long mills = day * 24 * 60 * 60 * 1000 + hour * 60 * 60 * 1000 + min * 60 * 1000 + sec * 1000 + mill;
			return isPlus == false ? (0 - mills) : mills;
		}
		return 0L;
	}
 
	/**
	 * 返回两个日期是否是相同的天数
	 *
	 * @param date1 要比对的第一个日期
	 * @param date2 要比对的第二个日期
	 * @return true or false
	 */
	public static boolean isSameDay(Date date1, Date date2) {
		return DateUtils.isSameDay(date1, date2);
	}
 
	/**
	 * 验证日期字符串合法性
	 *
	 * @param str           日期字符串
	 * @param dateFormatStr 日期格式化字符串
	 * @return true or false
	 * @remark 使用了try-catch格式化的方式校验日期
	 */
	public static boolean validateDateStr(String str, String dateFormatStr) {
		SimpleDateFormat format = new SimpleDateFormat(dateFormatStr);
		try {
			// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
			format.setLenient(false);
			format.parse(str);
			return true;
		} catch (ParseException e) {
			// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
			return false;
		}
	}
 
	/**
	 * 依据传入的格式化日期字符串,验证日期字符串合法性
	 *
	 * @param str       日期字符串
	 * @param formatStr 日期格式化字符串
	 * @return
	 */
	public static boolean checkDateStr(String str, String formatStr) {
		return validateDateStr(str, formatStr);
	}
 
	/**
	 * 判断字符是否为空或空白字符串,或各种null组成
	 */
	private static boolean isNull(String str) {
		return str == null || str.length() == 0 || "".equals(str.trim()) || "NULL".equals(str.trim().toUpperCase()) || "NULLNULL".equals(str.trim().toUpperCase()) || "NULLNULLNULL".equals(str.trim().toUpperCase());
	}
 
	public static void testCalendar(String[] args) {
		Calendar calendar = Calendar.getInstance();
 
		// System.out.println(calendar.get(0));//ERA 年代时代纪元
		System.out.println(calendar.get(1));// 年份
		System.out.println(calendar.get(2));// 减了1的月份
		System.out.println(calendar.get(3));// WEEK_OF_YEAR
		System.out.println(calendar.get(4));// WEEK_OF_MONTH
		System.out.println(calendar.get(5));// 天数
		System.out.println(calendar.get(6));// DAY_OF_YEAR
		System.out.println(calendar.get(7));// DAY_OF_WEEK
		System.out.println(calendar.get(8));// DAY_OF_WEEK_IN_MONTH
		System.out.println(calendar.get(9));// AM_PM
		System.out.println(calendar.get(10));// HOUR 12小时制
		System.out.println(calendar.get(11));// HOUR_OF_DAY 24小时制
		System.out.println(calendar.get(12));// 分数
		System.out.println(calendar.get(13));// 秒值
		System.out.println(calendar.get(14));// 毫秒值
		System.out.println(calendar.get(15));// ZONE_OFFSET 28800000
		System.out.println(calendar.get(16));// DST_OFFSET 0
		System.out.println(DateUtil.getDateString(calendar.getTime(), LOGGER_FORMAT_PATTERN));
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值