|
@@ -0,0 +1,1376 @@
|
|
|
+package com.rf.conversion.utils;
|
|
|
+
|
|
|
+import java.text.DateFormat;
|
|
|
+import java.text.DecimalFormat;
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.*;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.GregorianCalendar;
|
|
|
+import java.util.TimeZone;
|
|
|
+
|
|
|
+public class DateUtil {
|
|
|
+ /**
|
|
|
+ * 默认的日期格式组合,用来将字符串转化为日期用
|
|
|
+ */
|
|
|
+ public static final String[] DATE_PARSE_PATTERNS = {"yyyy/MM/dd",
|
|
|
+ "yyyy-MM-dd", "yyyy年MM月dd日"};
|
|
|
+ /**
|
|
|
+ * 获取当前系统时间格式
|
|
|
+ */
|
|
|
+ public static final String DEFAULT_DATE = "yyyy-MM-dd HH:mm:ss";
|
|
|
+ /**
|
|
|
+ * 特殊日期格式
|
|
|
+ */
|
|
|
+ public static final String DEFAULT_DATE_T = "yyyy-MM-dd:HH:mm";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 特殊日期格式2
|
|
|
+ */
|
|
|
+ public static final String DEFAULT_DATE_T2 = "yyyy-MM-dd HH:mm";
|
|
|
+ /**
|
|
|
+ * 默认的时间格式
|
|
|
+ */
|
|
|
+ public static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认的日期格式
|
|
|
+ */
|
|
|
+ public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前系统时间格式
|
|
|
+ * 用于生成文件名
|
|
|
+ */
|
|
|
+ public static final String DEFAULT_FILE_DATE = "yyyyMMddHHmmss";
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周日
|
|
|
+ */
|
|
|
+ public static final int SUNDAY = 1;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周一
|
|
|
+ */
|
|
|
+ public static final int MONDAY = 2;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周二
|
|
|
+ */
|
|
|
+ public static final int TUESDAY = 3;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周三
|
|
|
+ */
|
|
|
+ public static final int WEDNESDAY = 4;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周四
|
|
|
+ */
|
|
|
+ public static final int THURSDAY = 5;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周五
|
|
|
+ */
|
|
|
+ public static final int FRIDAY = 6;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期代码,周六
|
|
|
+ */
|
|
|
+ public static final int SATURDAY = 7;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期精度,秒
|
|
|
+ */
|
|
|
+ public static final int ACCURACY_SECOND = 1;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期精度,分
|
|
|
+ */
|
|
|
+ public static final int ACCURACY_MINUTE = 2;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期精度,小时
|
|
|
+ */
|
|
|
+ public static final int ACCURACY_HOUR = 3;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期精度,天
|
|
|
+ */
|
|
|
+ public static final int ACCURACY_DAY = 4;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期精度,月
|
|
|
+ */
|
|
|
+ public static final int ACCURACY_MONTH = 5;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期精度,年
|
|
|
+ */
|
|
|
+ public static final int ACCURACY_YEAR = 6;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较用日期格式,精度为年
|
|
|
+ */
|
|
|
+ public static final String ACCURACY_PATTERN_YEAR = "yyyy";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较用日期格式,精度为月
|
|
|
+ */
|
|
|
+ public static final String ACCURACY_PATTERN_MONTH = "yyyyMM";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较用日期格式,精度为日
|
|
|
+ */
|
|
|
+ public static final String ACCURACY_PATTERN_DAY = "yyyyMMdd";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较用日期格式,精度为时
|
|
|
+ */
|
|
|
+ public static final String ACCURACY_PATTERN_HOUR = "yyyyMMddHH";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较用日期格式,精度为分
|
|
|
+ */
|
|
|
+ public static final String ACCURACY_PATTERN_MINUTE = "yyyyMMddHHmm";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较用日期格式,精度为秒
|
|
|
+ */
|
|
|
+ public static final String ACCURACY_PATTERN_SECOND = "yyyyMMddHHmmss";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单一属性格式,时
|
|
|
+ */
|
|
|
+ public static final String SINGLE_YEAR = "yyyy";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单一属性格式,时
|
|
|
+ */
|
|
|
+ public static final String SINGLE_MONTH = "M";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单一属性格式,时
|
|
|
+ */
|
|
|
+ public static final String SINGLE_DAY = "d";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单一属性格式,时
|
|
|
+ */
|
|
|
+ public static final String SINGLE_HOUR = "H";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单一属性格式,分
|
|
|
+ */
|
|
|
+ public static final String SINGLE_MINUTE = "m";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单一属性格式,秒
|
|
|
+ */
|
|
|
+ public static final String SINGLE_SECOND = "s";
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public static final long MILLISECONDS_PER_SECOND = 1000;
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public static final long MILLISECONDS_PER_MINUTE = 1000 * 60;
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public static final long MILLISECONDS_PER_HOUR = 1000 * 60 * 60;
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public static final long MILLISECONDS_PER_DAY = 1000 * 60 * 60 * 24;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将给定的日期字符串,按照预定的日期格式,转化为Date型数据
|
|
|
+ *
|
|
|
+ * @param dateStr 日期字符字符串
|
|
|
+ * @return 日期型结果
|
|
|
+ */
|
|
|
+ public static Date parseDate(String dateStr) {
|
|
|
+ Date date = null;
|
|
|
+ try {
|
|
|
+ date = org.apache.commons.lang.time.DateUtils.parseDate(dateStr,
|
|
|
+ DATE_PARSE_PATTERNS);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定格式转化String型日期到Date型
|
|
|
+ *
|
|
|
+ * @param dateStr String型日期
|
|
|
+ * @param parsePattern 指定的格式
|
|
|
+ * @return Date型日期
|
|
|
+ */
|
|
|
+ public static Date parseDate(String dateStr, String parsePattern) {
|
|
|
+ Date date = null;
|
|
|
+ try {
|
|
|
+ date = org.apache.commons.lang.time.DateUtils.parseDate(dateStr,
|
|
|
+ new String[]{parsePattern.toString()});
|
|
|
+ } catch (ParseException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回系统当前时间(Date型)
|
|
|
+ *
|
|
|
+ * @return 系统当前时间
|
|
|
+ */
|
|
|
+ public static Date getCurrentDate() {
|
|
|
+ return new Date();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,日加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 天数增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addDays(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addDays(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,周加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 周数增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addWeeks(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addWeeks(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,月加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 月数增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addMonths(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addMonths(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,年加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 年数增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addYears(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addYears(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,小时加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 小时增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addHours(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addHours(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,分钟加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 分钟增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addMinutes(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addMinutes(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期计算,秒加减
|
|
|
+ *
|
|
|
+ * @param date 初始日期
|
|
|
+ * @param amount 秒增量(负数为减)
|
|
|
+ * @return 计算后的日期
|
|
|
+ */
|
|
|
+ public static Date addSeconds(Date date, int amount) {
|
|
|
+ return org.apache.commons.lang.time.DateUtils.addSeconds(date, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定格式,返回日期时间字符串
|
|
|
+ *
|
|
|
+ * @param date 日期变量
|
|
|
+ * @param pattern 日期格式
|
|
|
+ * @return 日期时间字符串
|
|
|
+ */
|
|
|
+ public static String getDateStr(Date date, String pattern) {
|
|
|
+ DateFormat df = new SimpleDateFormat(pattern);
|
|
|
+ return df.format(date);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 输出时间String(默认格式)
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return 默认格式化的日期
|
|
|
+ */
|
|
|
+ public static String getTimeStr(Date date) {
|
|
|
+ return getDateStr(date, DEFAULT_TIME_PATTERN);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取指定日期所在月的第一天的日期
|
|
|
+ *
|
|
|
+ * @param date 指定的日期
|
|
|
+ * @return 指定日期所在月的第一天
|
|
|
+ */
|
|
|
+ public static Date getFirstDayOfMonth(Date date) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.DATE, 1);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取指定日期所在月的最后一天的日期
|
|
|
+ *
|
|
|
+ * @param date 指定的日期
|
|
|
+ * @return 指定日期所在月的最后一天
|
|
|
+ */
|
|
|
+ public static Date getLastDayOfMonth(Date date) {
|
|
|
+ Date nextMonth = addMonths(date, 1);
|
|
|
+ Date firstDayOfNextMonth = getFirstDayOfMonth(nextMonth);
|
|
|
+ return addDays(firstDayOfNextMonth, -1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取指定日期所在年的第一天的日期
|
|
|
+ *
|
|
|
+ * @param date 指定的日期
|
|
|
+ * @return 指定日期所在年的第一天
|
|
|
+ */
|
|
|
+ public static Date getFirstDayOfYear(Date date) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.DATE, 1);
|
|
|
+ cal.set(Calendar.MONTH, 0);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取指定日期所在年的最后一天的日期
|
|
|
+ *
|
|
|
+ * @param date 指定的日期
|
|
|
+ * @return 指定日期所在月的最后一天
|
|
|
+ */
|
|
|
+ public static Date getLastDayOfYear(Date date) {
|
|
|
+ Date nextMonth = addYears(date, 1);
|
|
|
+ Date firstDayOfNextYear = getFirstDayOfYear(nextMonth);
|
|
|
+ return addDays(firstDayOfNextYear, -1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取指定日期所在周的指定天的日期
|
|
|
+ *
|
|
|
+ * @param date 指定的日期
|
|
|
+ * @param day 指定的天(星期几)
|
|
|
+ * @param firstDay 一星期的起始天
|
|
|
+ * @return 指定周星期日的日期
|
|
|
+ */
|
|
|
+ public static Date getDayInWeek(Date date, int day, int firstDay) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.setFirstDayOfWeek(firstDay);
|
|
|
+ cal.set(Calendar.DAY_OF_WEEK, day);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据Date型的日期,取Calendar型的日期
|
|
|
+ *
|
|
|
+ * @param date Date型的日期
|
|
|
+ * @return Calendar型的日期
|
|
|
+ */
|
|
|
+ public static Calendar getCalendar(Date date) {
|
|
|
+ Calendar cal = Calendar.getInstance();
|
|
|
+ cal.setTime(date);
|
|
|
+ return cal;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期比较(精确到天),date1晚于date2
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @return date1晚于date2,返回true,否则返回false
|
|
|
+ */
|
|
|
+ public static boolean later(Date date1, Date date2) {
|
|
|
+ boolean result = false;
|
|
|
+ if (1 == compare(date1, date2, ACCURACY_DAY)) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期比较(精确到天),date1早于date2
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @return date1早于date2,返回true,否则返回false
|
|
|
+ */
|
|
|
+ public static boolean earlier(Date date1, Date date2) {
|
|
|
+ boolean result = false;
|
|
|
+ if (-1 == compare(date1, date2, ACCURACY_DAY)) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 日期比较(精确到天),date1等于date2
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @return date1等于date2,返回true,否则返回false
|
|
|
+ */
|
|
|
+ public static boolean equal(Date date1, Date date2) {
|
|
|
+ boolean result = false;
|
|
|
+ if (0 == compare(date1, date2, ACCURACY_DAY)) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定规则比较日期,date1晚于date2
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @param accuracy 日期精度
|
|
|
+ * @return date1晚于date2,返回true,否则返回false
|
|
|
+ */
|
|
|
+ public static boolean later(Date date1, Date date2, int accuracy) {
|
|
|
+ boolean result = false;
|
|
|
+ if (1 == compare(date1, date2, accuracy)) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定规则比较日期,date1早于date2
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @param accuracy 日期精度
|
|
|
+ * @return date1早于date2,返回true,否则返回false
|
|
|
+ */
|
|
|
+ public static boolean earlier(Date date1, Date date2, int accuracy) {
|
|
|
+ boolean result = false;
|
|
|
+ if (-1 == compare(date1, date2, accuracy)) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定规则比较日期,date1等于date2
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @param accuracy 日期精度
|
|
|
+ * @return date1等于date2,返回true,否则返回false
|
|
|
+ */
|
|
|
+ public static boolean equal(Date date1, Date date2, int accuracy) {
|
|
|
+ boolean result = false;
|
|
|
+ if (0 == compare(date1, date2, accuracy)) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定规则,比较日期
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @param accuracy 日期精度
|
|
|
+ * @return int型,date1晚,返回1;date1早,返回-1;相等,返回0
|
|
|
+ */
|
|
|
+ public static int compare(Date date1, Date date2, int accuracy) {
|
|
|
+ String pattern = DEFAULT_DATE_PATTERN;
|
|
|
+ switch (accuracy) {
|
|
|
+ case ACCURACY_YEAR:
|
|
|
+ pattern = ACCURACY_PATTERN_YEAR;
|
|
|
+ break;
|
|
|
+ case ACCURACY_MONTH:
|
|
|
+ pattern = ACCURACY_PATTERN_MONTH;
|
|
|
+ break;
|
|
|
+ case ACCURACY_DAY:
|
|
|
+ pattern = ACCURACY_PATTERN_DAY;
|
|
|
+ break;
|
|
|
+ case ACCURACY_HOUR:
|
|
|
+ pattern = ACCURACY_PATTERN_HOUR;
|
|
|
+ break;
|
|
|
+ case ACCURACY_MINUTE:
|
|
|
+ pattern = ACCURACY_PATTERN_MINUTE;
|
|
|
+ break;
|
|
|
+ case ACCURACY_SECOND:
|
|
|
+ pattern = ACCURACY_PATTERN_SECOND;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Date formatedDate1 = transDateFormat(date1, pattern);
|
|
|
+ Date formatedDate2 = transDateFormat(date2, pattern);
|
|
|
+ return formatedDate1.compareTo(formatedDate2);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定规则,比较日期
|
|
|
+ *
|
|
|
+ * @param date1 日期1
|
|
|
+ * @param date2 日期2
|
|
|
+ * @param accuracy 日期精度
|
|
|
+ * @return int型,date1晚,返回1;date1早,返回-1;相等,返回0
|
|
|
+ * @throws ParseException
|
|
|
+ */
|
|
|
+ public static int compare(String date1, String date2, int accuracy) throws ParseException {
|
|
|
+ String pattern = DEFAULT_DATE_PATTERN;
|
|
|
+ switch (accuracy) {
|
|
|
+ case ACCURACY_YEAR:
|
|
|
+ pattern = ACCURACY_PATTERN_YEAR;
|
|
|
+ break;
|
|
|
+ case ACCURACY_MONTH:
|
|
|
+ pattern = ACCURACY_PATTERN_MONTH;
|
|
|
+ break;
|
|
|
+ case ACCURACY_DAY:
|
|
|
+ pattern = ACCURACY_PATTERN_DAY;
|
|
|
+ break;
|
|
|
+ case ACCURACY_HOUR:
|
|
|
+ pattern = ACCURACY_PATTERN_HOUR;
|
|
|
+ break;
|
|
|
+ case ACCURACY_MINUTE:
|
|
|
+ pattern = ACCURACY_PATTERN_MINUTE;
|
|
|
+ break;
|
|
|
+ case ACCURACY_SECOND:
|
|
|
+ pattern = ACCURACY_PATTERN_SECOND;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE);
|
|
|
+ Date formatedDate1 = transDateFormat(sdf.parse(date1), pattern);
|
|
|
+ Date formatedDate2 = transDateFormat(sdf.parse(date2), pattern);
|
|
|
+ return formatedDate1.compareTo(formatedDate2);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据指定规则,转化日期,如只取年、取年月等
|
|
|
+ *
|
|
|
+ * @param date 待转化日期
|
|
|
+ * @param pattern 日期格式
|
|
|
+ * @return 转化后的日期
|
|
|
+ */
|
|
|
+ public static Date transDateFormat(Date date, String pattern) {
|
|
|
+ String dateStr = getDateStr(date, pattern);
|
|
|
+ return parseDate(dateStr, pattern);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回时定时间的年
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return String型的年
|
|
|
+ */
|
|
|
+ public static String getYear(Date date) {
|
|
|
+ return getDateStr(date, SINGLE_YEAR);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回时定时间的月
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return String型的月
|
|
|
+ */
|
|
|
+ public static String getMonth(Date date) {
|
|
|
+ return getDateStr(date, SINGLE_MONTH);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回时定时间的日
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return String型的日
|
|
|
+ */
|
|
|
+ public static String getDay(Date date) {
|
|
|
+ return getDateStr(date, SINGLE_DAY);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回时定时间的小时
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return String型的小时
|
|
|
+ */
|
|
|
+ public static String getHour(Date date) {
|
|
|
+ return getDateStr(date, SINGLE_HOUR);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回时定时间的分
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return String型的分
|
|
|
+ */
|
|
|
+ public static String getMinute(Date date) {
|
|
|
+ return getDateStr(date, SINGLE_MINUTE);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回时定时间的秒
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return String型的秒
|
|
|
+ */
|
|
|
+ public static String getSecond(Date date) {
|
|
|
+ return getDateStr(date, SINGLE_SECOND);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将时间日期变量的年份变为指定年, 如果日期不存在,则向后一天,如20102月
|
|
|
+ *
|
|
|
+ * @param date 日期时间变量
|
|
|
+ * @param amount 指定年
|
|
|
+ * @return 修改后的日期变量
|
|
|
+ */
|
|
|
+ public static Date setYear(Date date, int amount) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.YEAR, amount);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将时间日期变量的月份变为指定月
|
|
|
+ *
|
|
|
+ * @param date 日期时间变量
|
|
|
+ * @param amount 指定月
|
|
|
+ * @return 修改后的日期变量
|
|
|
+ */
|
|
|
+ public static Date setMonth(Date date, int amount) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.MONTH, amount - 1);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将时间日期变量的年份变为指定日
|
|
|
+ *
|
|
|
+ * @param date 日期时间变量
|
|
|
+ * @param amount 指定日
|
|
|
+ * @return 修改后的日期变量
|
|
|
+ */
|
|
|
+ public static Date setDay(Date date, int amount) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.DAY_OF_MONTH, amount);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将时间日期变量的小时变为指定时
|
|
|
+ *
|
|
|
+ * @param date 日期时间变量
|
|
|
+ * @param amount 指定时
|
|
|
+ * @return 修改后的日期变量
|
|
|
+ */
|
|
|
+ public static Date setHour(Date date, int amount) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.HOUR_OF_DAY, amount);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将时间日期变量的分钟变为指定分
|
|
|
+ *
|
|
|
+ * @param date 日期时间变量
|
|
|
+ * @param amount 指定分
|
|
|
+ * @return 修改后的日期变量
|
|
|
+ */
|
|
|
+ public static Date setMinute(Date date, int amount) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.MINUTE, amount);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将时间日期变量的秒变为指定秒
|
|
|
+ *
|
|
|
+ * @param date 日期时间变量
|
|
|
+ * @param amount 指定秒
|
|
|
+ * @return 修改后的日期变量
|
|
|
+ */
|
|
|
+ public static Date setSecond(Date date, int amount) {
|
|
|
+ Calendar cal = getCalendar(date);
|
|
|
+ cal.set(Calendar.SECOND, amount);
|
|
|
+ return cal.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据制定单位,计算两个日期之间的天数差
|
|
|
+ *
|
|
|
+ * @param a 时间点1
|
|
|
+ * @param b 时间点2
|
|
|
+ * @return 时间差
|
|
|
+ */
|
|
|
+ public static int getDateDistance(Date a, Date b) {
|
|
|
+ return getDateDistance(a, b, ACCURACY_DAY);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据制定单位,计算两个日期之间的差
|
|
|
+ *
|
|
|
+ * @param a 时间点1
|
|
|
+ * @param b 时间点2
|
|
|
+ * @param unit 时间单位
|
|
|
+ * @return 时间差
|
|
|
+ */
|
|
|
+ public static int getDateDistance(Date a, Date b, int unit) {
|
|
|
+ int result = 0;
|
|
|
+ if (null != a && null != b) {
|
|
|
+ String pattern = null;
|
|
|
+ switch (unit) {
|
|
|
+ case ACCURACY_HOUR: // '\003'
|
|
|
+ pattern = "yyyyMMddHH";
|
|
|
+ break;
|
|
|
+ case ACCURACY_MINUTE: // '\002'
|
|
|
+ pattern = "yyyyMMddHHmm";
|
|
|
+ break;
|
|
|
+ case ACCURACY_SECOND: // '\001'
|
|
|
+ pattern = "yyyyMMddHHmmss";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pattern = "yyyyMMdd";
|
|
|
+ }
|
|
|
+ Date startDate = transDateFormat(1 != a.compareTo(b) ? a : b,
|
|
|
+ pattern);
|
|
|
+ Date endDate = transDateFormat(1 != a.compareTo(b) ? b : a, pattern);
|
|
|
+ if (1 <= unit && 4 >= unit) {
|
|
|
+ result = getDistanceByUnit(startDate, endDate, unit);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ GregorianCalendar startCalendar = new GregorianCalendar();
|
|
|
+ startCalendar.setTime(startDate);
|
|
|
+ int startYears = startCalendar.get(Calendar.YEAR);
|
|
|
+ int startMonths = startCalendar.get(Calendar.MONTH);
|
|
|
+ int startDays = startCalendar.get(Calendar.DAY_OF_MONTH);
|
|
|
+
|
|
|
+ GregorianCalendar endCalendar = new GregorianCalendar();
|
|
|
+ endCalendar.setTime(endDate);
|
|
|
+ int endYears = endCalendar.get(Calendar.YEAR);
|
|
|
+ int endMonths = endCalendar.get(Calendar.MONTH);
|
|
|
+ int endDays = endCalendar.get(Calendar.DAY_OF_MONTH);
|
|
|
+
|
|
|
+ int yearBetween = endYears - startYears;
|
|
|
+ int monthBetween = endMonths - startMonths;
|
|
|
+ if (endDays < startDays
|
|
|
+ && endDays != endCalendar.getActualMaximum(Calendar.DATE)) {
|
|
|
+ monthBetween--;
|
|
|
+ }
|
|
|
+ if (ACCURACY_YEAR == unit) {
|
|
|
+ if (monthBetween < 0) {
|
|
|
+ yearBetween--;
|
|
|
+ }
|
|
|
+ result = yearBetween;
|
|
|
+ }
|
|
|
+ if (ACCURACY_MONTH == unit) {
|
|
|
+ result = (yearBetween * 12 + monthBetween);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 内部方法,计算时间点的差距
|
|
|
+ *
|
|
|
+ * @param startDate 起始时间
|
|
|
+ * @param endDate 终止时间
|
|
|
+ * @param unit 时间单位
|
|
|
+ * @return 时间差
|
|
|
+ */
|
|
|
+ public static int getDistanceByUnit(Date startDate, Date endDate, int unit) {
|
|
|
+ int result = 0;
|
|
|
+ long millisecondPerUnit = MILLISECONDS_PER_DAY;
|
|
|
+ switch (unit) {
|
|
|
+ case ACCURACY_HOUR:
|
|
|
+ millisecondPerUnit = MILLISECONDS_PER_HOUR;
|
|
|
+ break;
|
|
|
+ case ACCURACY_MINUTE:
|
|
|
+ millisecondPerUnit = MILLISECONDS_PER_MINUTE;
|
|
|
+ break;
|
|
|
+ case ACCURACY_SECOND:
|
|
|
+ millisecondPerUnit = MILLISECONDS_PER_SECOND;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ long start = startDate.getTime();
|
|
|
+ long end = endDate.getTime();
|
|
|
+ long distance = end - start;
|
|
|
+ result = Integer.valueOf((distance / millisecondPerUnit) + "");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 内部方法,计算时间点的差距toLong
|
|
|
+ *
|
|
|
+ * @param startDate 起始时间
|
|
|
+ * @param endDate 终止时间
|
|
|
+ * @param unit 时间单位
|
|
|
+ * @return 时间差
|
|
|
+ */
|
|
|
+ public static long getDistanceByUnit_toLong(Date startDate, Date endDate, int unit) {
|
|
|
+ long result = 0;
|
|
|
+ long millisecondPerUnit = MILLISECONDS_PER_DAY;
|
|
|
+ switch (unit) {
|
|
|
+ case ACCURACY_HOUR:
|
|
|
+ millisecondPerUnit = MILLISECONDS_PER_HOUR;
|
|
|
+ break;
|
|
|
+ case ACCURACY_MINUTE:
|
|
|
+ millisecondPerUnit = MILLISECONDS_PER_MINUTE;
|
|
|
+ break;
|
|
|
+ case ACCURACY_SECOND:
|
|
|
+ millisecondPerUnit = MILLISECONDS_PER_SECOND;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ long start = startDate.getTime();
|
|
|
+ long end = endDate.getTime();
|
|
|
+ long distance = end - start;
|
|
|
+ result = distance / millisecondPerUnit;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回指定日期是当年的第几周
|
|
|
+ *
|
|
|
+ * @param date 指定日期
|
|
|
+ * @return 周数(从1开始)
|
|
|
+ */
|
|
|
+ public static int getWeekOfYear(Date date) {
|
|
|
+ return getCalendar(date).get(Calendar.WEEK_OF_YEAR);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取指定日期是星期几
|
|
|
+ *
|
|
|
+ * @param date 指定日期
|
|
|
+ * @return 星期日--1; 星期一--2; 星期二--3; 星期三--4; 星期四--5; 星期五--6; 星期六--7;
|
|
|
+ */
|
|
|
+ public static int getWeekOfDate(Date date) {
|
|
|
+ return getCalendar(date).get(Calendar.DAY_OF_WEEK);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断指定年份日期的年份是否为闰年
|
|
|
+ *
|
|
|
+ * @param date 日期
|
|
|
+ * @return 闰年ture,非闰年false
|
|
|
+ */
|
|
|
+ public static boolean isLeapYear(Date date) {
|
|
|
+ int year = getCalendar(date).get(Calendar.YEAR);
|
|
|
+ return isLeapYear(year);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断指定年份日期的年份是否为闰年
|
|
|
+ *
|
|
|
+ * @param year 年份数字
|
|
|
+ * @return 闰年ture,非闰年false
|
|
|
+ */
|
|
|
+ public static boolean isLeapYear(int year) {
|
|
|
+ if ((year % 400) == 0) {
|
|
|
+ return true;
|
|
|
+ } else if ((year % 4) == 0) {
|
|
|
+ if ((year % 100) == 0) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按照strFormat格式输出当前时间
|
|
|
+ *
|
|
|
+ * @param strFormat 格式
|
|
|
+ * @return 指定格式的当前系统日期
|
|
|
+ */
|
|
|
+ public static String getCurrentDate(String strFormat) {
|
|
|
+ return getDateStr(getCurrentDate(), strFormat);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验日期数据(校验输入值是否为指定的日期格式)
|
|
|
+ *
|
|
|
+ * @param strDate 要校验的日期
|
|
|
+ * @param strFormat 日期格式
|
|
|
+ * @return true/false (符合/不符合)
|
|
|
+ */
|
|
|
+ public static boolean checkDate(String strDate, String strFormat) {
|
|
|
+ Date date = null;
|
|
|
+ if ((strDate != null) && (strDate.trim().length() != 0)) {
|
|
|
+ DateFormat myDateFmt = new SimpleDateFormat(strFormat);
|
|
|
+ try {
|
|
|
+ date = myDateFmt.parse(strDate);
|
|
|
+
|
|
|
+ if (!strDate.equals(myDateFmt.format(date))) {
|
|
|
+ date = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } catch (ParseException e) {
|
|
|
+ date = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param
|
|
|
+ * @return 格式为"yyyy-MM-dd HH:mm:ss"的时间
|
|
|
+ * @throws
|
|
|
+ * @Description:获取当期系统日期以特定格式显示
|
|
|
+ * @author baolf
|
|
|
+ * @date 2016-7-25
|
|
|
+ */
|
|
|
+ public static String getNowTime() {
|
|
|
+ Date now = new Date();
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(DEFAULT_DATE);
|
|
|
+ String date = sd.format(now);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param
|
|
|
+ * @return 格式为"yyyy-MM-dd HH:mm:ss"的时间
|
|
|
+ * @throws
|
|
|
+ * @Description:获取当期系统两小时后时间 以特定格式显示
|
|
|
+ * @author wwq
|
|
|
+ * @date 2018-08-13
|
|
|
+ */
|
|
|
+ public static String get2HoursLater() {
|
|
|
+ Date twoHours = new Date(System.currentTimeMillis() + 120 * 60 * 1000);
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(DEFAULT_DATE);
|
|
|
+ String date = sd.format(twoHours);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param
|
|
|
+ * @return 格式为"yyyy-MM-dd"的时间
|
|
|
+ * @throws
|
|
|
+ * @Description:获取当期系统日期以特定格式显示
|
|
|
+ * @author
|
|
|
+ * @date 2016-7-25
|
|
|
+ */
|
|
|
+ public static String getNowTime1() {
|
|
|
+ Date now = new Date();
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
|
|
|
+ String date = sd.format(now);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自定义时间格式
|
|
|
+ *
|
|
|
+ * @param strFormat
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getNowTime(String strFormat) {
|
|
|
+ Date now = new Date();
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(strFormat);
|
|
|
+ String date = sd.format(now);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 时间串,没有分割符
|
|
|
+ * 用于自动生成文件名用
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static synchronized String getFileNameNowTime() {
|
|
|
+ Date now = new Date();
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(DEFAULT_FILE_DATE);
|
|
|
+ String date = sd.format(now);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得几位随机数(正数)
|
|
|
+ *
|
|
|
+ * @param num
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getRandom(int num) {
|
|
|
+ StringBuffer format = new StringBuffer("0.0");
|
|
|
+ for (int ii = 2; ii <= num; ii++) {
|
|
|
+ format.append("0");
|
|
|
+ }
|
|
|
+ DecimalFormat df = new DecimalFormat(format.toString());
|
|
|
+ return df.format(Math.random()).replace("0.", "");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getReleaseBatch() {
|
|
|
+ Date now = new Date();
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
|
|
|
+ String date = sd.format(now);
|
|
|
+ date = date.replace("-", "");
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ // public static void main(String[] args) {
|
|
|
+// }
|
|
|
+ public static String getBeforeNowTime() {
|
|
|
+ long time = 1 * 60 * 1000 + 10000;//1分钟
|
|
|
+ Date now = new Date(new Date().getTime() - time);
|
|
|
+ SimpleDateFormat sd = new SimpleDateFormat(DEFAULT_DATE);
|
|
|
+ String date = sd.format(now);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取秒数 (1970-01-01 08:00:00)
|
|
|
+ *
|
|
|
+ * @param :
|
|
|
+ * @throws :
|
|
|
+ * @Description :
|
|
|
+ * @author :
|
|
|
+ */
|
|
|
+ public static int getDateInt(String date) {
|
|
|
+ return getDistanceByUnit(
|
|
|
+ parseDate("1970-01-01 08:00:00", DEFAULT_DATE),
|
|
|
+ parseDate(date, DEFAULT_DATE), 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断字符串是否不为空 空返回false 非空返回true
|
|
|
+ *
|
|
|
+ * @param sourceStr
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static boolean isNotEmpty(String sourceStr) {
|
|
|
+
|
|
|
+ if (sourceStr == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (sourceStr.trim().length() > 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 统计两个时间的时间差
|
|
|
+ * 相差几秒几毫秒
|
|
|
+ */
|
|
|
+ public static String getDistanceTime(String str1, String str2) {
|
|
|
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
|
|
|
+ Date one;
|
|
|
+ Date two;
|
|
|
+ long day = 0;//天数差
|
|
|
+ long hour = 0;//小时数差
|
|
|
+ long min = 0;//分钟数差
|
|
|
+ long second = 0;//秒数差
|
|
|
+ long diff = 0;//毫秒差
|
|
|
+ String result = null;
|
|
|
+ try {
|
|
|
+ final Calendar c = Calendar.getInstance();
|
|
|
+ c.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
|
|
|
+ one = df.parse(str1);
|
|
|
+ c.setTime(one);
|
|
|
+ two = df.parse(str2);
|
|
|
+ long time1 = one.getTime();
|
|
|
+ long time2 = two.getTime();
|
|
|
+ diff = time2 - time1;
|
|
|
+ day = diff / (24 * 60 * 60 * 1000);
|
|
|
+ hour = (diff / (60 * 60 * 1000) - day * 24);
|
|
|
+ min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
|
|
|
+ second = diff / 1000;
|
|
|
+ //System.out.println("day="+day+" hour="+hour+" min="+min+" ss="+second%60+" SSS="+diff%1000);
|
|
|
+ result = second % 60 + "秒" + diff % 1000 + "毫秒";
|
|
|
+ } catch (ParseException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return String.valueOf(diff);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取两个日期相差的月数
|
|
|
+ */
|
|
|
+ public static int getMonthDiff(Date d1, Date d2) {
|
|
|
+ Calendar c1 = Calendar.getInstance();
|
|
|
+ Calendar c2 = Calendar.getInstance();
|
|
|
+ c1.setTime(d1);
|
|
|
+ c2.setTime(d2);
|
|
|
+ int year1 = c1.get(Calendar.YEAR);
|
|
|
+ int year2 = c2.get(Calendar.YEAR);
|
|
|
+ int month1 = c1.get(Calendar.MONTH);
|
|
|
+ int month2 = c2.get(Calendar.MONTH);
|
|
|
+ int day1 = c1.get(Calendar.DAY_OF_MONTH);
|
|
|
+ int day2 = c2.get(Calendar.DAY_OF_MONTH);
|
|
|
+ // 获取年的差值
|
|
|
+ int yearInterval = year1 - year2;
|
|
|
+ // 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
|
|
|
+ if (month1 < month2 || month1 == month2 && day1 < day2) {
|
|
|
+ yearInterval--;
|
|
|
+ }
|
|
|
+ // 获取月数差值
|
|
|
+ int monthInterval = (month1 + 12) - month2;
|
|
|
+ if (day1 < day2) {
|
|
|
+ monthInterval--;
|
|
|
+ }
|
|
|
+ monthInterval %= 12;
|
|
|
+ int monthsDiff = Math.abs(yearInterval * 12 + monthInterval);
|
|
|
+ return monthsDiff;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws ParseException {
|
|
|
+
|
|
|
+ int monthDiff = getMonthDiff(new Date(), new SimpleDateFormat("yyyy-MM-dd").parse("1991-05-16"));
|
|
|
+ System.out.println(monthDiff);
|
|
|
+ System.out.println(monthDiff / 12);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 将yyyyMMddHHmmss格式的数据装换成yyyy-MM-dd:HH:mm格式的数据
|
|
|
+ * */
|
|
|
+ public static String formatDate(String dateStr) throws NullPointerException {
|
|
|
+ //
|
|
|
+ StringBuffer dateBuffer = new StringBuffer();
|
|
|
+ return dateBuffer.append(dateStr.substring(0, 4)).append("-").append(dateStr.substring(4, 6)).append("-").append(dateStr.substring(6, 8))
|
|
|
+ .append(" ").append(dateStr.substring(8, 10)).append(":").append(dateStr.substring(10, 12)).append(":").append(dateStr.substring(12, 14)).toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取今天的开始时间,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getTodayBeginTime() {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ // 获取当天的开始时间(00:00:00)
|
|
|
+ LocalDateTime startOfDay = today.atStartOfDay();
|
|
|
+ ZonedDateTime zonedStartOfDay = startOfDay.atZone(ZoneId.systemDefault());
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String formattedStartOfDay = zonedStartOfDay.format(formatter);
|
|
|
+ System.out.println("当天的开始时间: " + formattedStartOfDay);
|
|
|
+ return formattedStartOfDay;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当天的结束时间,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getTodayEndTime() {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ LocalDateTime endOfDay = today.atTime(LocalTime.MAX);
|
|
|
+ ZonedDateTime zonedEndOfDay = endOfDay.atZone(ZoneId.systemDefault());
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String formattedEndOfDay = zonedEndOfDay.format(formatter);
|
|
|
+ System.out.println("当天的结束时间: " + formattedEndOfDay);
|
|
|
+ return formattedEndOfDay;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得当前月第一天的时间起点,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getMonthBeginTime() {
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ // 获取当前年份和月份
|
|
|
+ YearMonth currentYearMonth = YearMonth.from(today);
|
|
|
+ // 获取当前月份的第一天
|
|
|
+ LocalDate firstDayOfMonth = currentYearMonth.atDay(1);
|
|
|
+ LocalDateTime startOfDay = firstDayOfMonth.atStartOfDay();
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ return startOfDay.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得当前月最后一天的时间终点,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getMonthEndTime() {
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ // 获取当前年份和月份
|
|
|
+ YearMonth currentYearMonth = YearMonth.from(today);
|
|
|
+ // 获取当前月份的最后一天
|
|
|
+ LocalDate lastDayOfMonth = currentYearMonth.atEndOfMonth();
|
|
|
+ LocalDateTime endOfDay = lastDayOfMonth.atTime(LocalTime.of(23, 59, 59));
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ return endOfDay.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前季度的开始时间,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ */
|
|
|
+ public static String getQuarterBeginTime() {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ // 获取当前日期所在的季度
|
|
|
+ int quarter = (today.getMonthValue() - 1) / 3 + 1;
|
|
|
+ // 获取当前季度的第一天
|
|
|
+ LocalDate firstDayOfQuarter = getFirstDayOfQuarter(today, quarter);
|
|
|
+ // 设置时间为00:00:00
|
|
|
+ LocalDateTime startOfQuarter = firstDayOfQuarter.atStartOfDay();
|
|
|
+ // 定义日期时间格式器
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ // 格式化日期时间
|
|
|
+ return startOfQuarter.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前季度的结束时间,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getQuarterEndTime() {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ // 获取当前日期所在的季度
|
|
|
+ int quarter = (today.getMonthValue() - 1) / 3 + 1;
|
|
|
+
|
|
|
+ // 获取当前季度的最后一天
|
|
|
+ LocalDate lastDayOfQuarter = getLastDayOfQuarter(today, quarter);
|
|
|
+
|
|
|
+ // 设置时间为 23:59:59
|
|
|
+ LocalDateTime endOfQuarter = lastDayOfQuarter.atTime(LocalTime.of(23, 59, 59));
|
|
|
+
|
|
|
+ // 定义日期时间格式器
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ // 格式化日期时间
|
|
|
+ return endOfQuarter.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前日期所在年份的开始时间,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getYearBeginTime() {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ // 获取当前年份的第一天
|
|
|
+ LocalDate firstDayOfYear = LocalDate.of(today.getYear(), 1, 1);
|
|
|
+
|
|
|
+ // 设置时间为00:00:00
|
|
|
+ LocalDateTime startOfYear = firstDayOfYear.atStartOfDay();
|
|
|
+
|
|
|
+ // 定义日期时间格式器
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ // 格式化日期时间
|
|
|
+ return startOfYear.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前日期所在年份的结束时间,并格式化为yyyy-MM-dd HH:mm:ss
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getYearEndTime() {
|
|
|
+ //获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ //获取当前年份的最后一天
|
|
|
+ LocalDate endDayOfYear = LocalDate.of(today.getYear(), 12, 31);
|
|
|
+
|
|
|
+ // 设置时间为23:59:59
|
|
|
+ LocalDateTime endOfYear = endDayOfYear.atTime(LocalTime.of(23, 59, 59));
|
|
|
+
|
|
|
+ // 定义日期时间格式器
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ // 格式化日期时间
|
|
|
+ return endOfYear.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private static LocalDate getFirstDayOfQuarter(LocalDate date, int quarter) {
|
|
|
+ Month firstMonthOfQuarter;
|
|
|
+ switch (quarter) {
|
|
|
+ case 1:
|
|
|
+ firstMonthOfQuarter = Month.JANUARY;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ firstMonthOfQuarter = Month.APRIL;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ firstMonthOfQuarter = Month.JULY;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ firstMonthOfQuarter = Month.OCTOBER;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException("Invalid quarter: " + quarter);
|
|
|
+ }
|
|
|
+ return LocalDate.of(date.getYear(), firstMonthOfQuarter, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static LocalDate getLastDayOfQuarter(LocalDate date, int quarter) {
|
|
|
+ Month lastMonthOfQuarter;
|
|
|
+ switch (quarter) {
|
|
|
+ case 1:
|
|
|
+ lastMonthOfQuarter = Month.MARCH;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ lastMonthOfQuarter = Month.JUNE;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ lastMonthOfQuarter = Month.SEPTEMBER;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ lastMonthOfQuarter = Month.DECEMBER;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException("Invalid quarter: " + quarter);
|
|
|
+ }
|
|
|
+ return LocalDate.of(date.getYear(), lastMonthOfQuarter, lastMonthOfQuarter.maxLength());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|