DateUtils - genscript-lz/manufacturing GitHub Wiki
package com.genscript.gsscm.common.util;
import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone;
import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar;
import org.apache.commons.lang.StringUtils;
public class DateUtils {
/**
* 静态常量
*/
public static final String C_TIME_PATTON_DEFAULT = "yyyy-MM-dd HH:mm:ss";
/**
* 一天开始的时间格式 yyyy-MM-dd 00:00:00
*/
public static final String C_TIME_PATTON_START = "yyyy-MM-dd 00:00:00";
/**
* 一天结束的时间格式 yyyy-MM-dd 23:59:59
*/
public static final String C_TIME_PATTON_END = "yyyy-MM-dd 23:59:59";
public static final String C_DATE_PATTON_DEFAULT = "yyyy-MM-dd";
public static final String C_DATE_PATTON_DEFAULT_2 = "yyyy/MM/dd";
public static final String C_DATE_PATTON_DEFAULT_3 = "yyyy 年 MM 月 dd 日";
public static final int C_ONE_SECOND = 1000;
public static final int C_ONE_MINUTE = 60 * C_ONE_SECOND;
public static final long C_ONE_HOUR = 60 * C_ONE_MINUTE;
public static final long C_ONE_DAY = 24 * C_ONE_HOUR;
/**
* 计算当前月份的最大天数
*
* @return
*/
public static int findMaxDayInMonth() {
return findMaxDayInMonth(0, 0);
}
/**
* 计算指定日期月份的最大天数
*
* @param date
* @return
*/
public static int findMaxDayInMonth(Date date) {
if (date == null) {
return 0;
}
return findMaxDayInMonth(date2Calendar(date));
}
/**
* 计算指定日历月份的最大天数
*
* @param calendar
* @return
*/
public static int findMaxDayInMonth(Calendar calendar) {
if (calendar == null) {
return 0;
}
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 计算当前年某月份的最大天数
*
* @param month
* @return
*/
public static int findMaxDayInMonth(int month) {
return findMaxDayInMonth(0, month);
}
/**
* 计算某年某月份的最大天数
*
* @param year
* @param month
* @return
*/
public static int findMaxDayInMonth(int year, int month) {
Calendar calendar = Calendar.getInstance();
if (year > 0) {
calendar.set(Calendar.YEAR, year);
}
if (month > 0) {
calendar.set(Calendar.MONTH, month - 1);
}
return findMaxDayInMonth(calendar);
}
/**
* Calendar 转换为 Date
*
* @param calendar
* @return
*/
public static Date calendar2Date(Calendar calendar) {
if (calendar == null) {
return null;
}
return calendar.getTime();
}
/**
* Date 转换为 Calendar
*
* @param date
* @return
*/
public static Calendar date2Calendar(Date date) {
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
/**
* 拿到默认格式的SimpleDateFormat
*
* @return
*/
public static SimpleDateFormat getSimpleDateFormat() {
return getSimpleDateFormat(null);
}
/**
* 拿到指定输出格式的SimpleDateFormat
*
* @param format
* @return
*/
public static SimpleDateFormat getSimpleDateFormat(String format) {
SimpleDateFormat sdf;
if (format == null) {
sdf = new SimpleDateFormat(C_TIME_PATTON_DEFAULT);
} else {
sdf = new SimpleDateFormat(format);
}
return sdf;
}
/**
* 转换当前时间为默认格式
*
* @return
*/
public static String formatDate2Str() {
return formatDate2Str(new Date());
}
/**
* 转换指定时间为默认格式
*
* @param date
* @return
*/
public static String formatDate2Str(Date date) {
return formatDate2Str(date, C_TIME_PATTON_DEFAULT);
}
/**
* 某天最大时间
*
* @param date
* @return
*/
public static String formatMaxDate2Str(Date date) {
String date_str = formatDate2Str(date, C_TIME_PATTON_DEFAULT);
return date_str.split(" ")[0] + " 23:59:59";
}
/**
* 某天最小时间
*
* @param date
* @return
*/
public static String formatMinDate2Str(Date date) {
String date_str = formatDate2Str(date, C_TIME_PATTON_DEFAULT);
return date_str.split(" ")[0] + " 00:00:00";
}
/**
* 转换指定时间为指定格式
*
* @param date
* @param format
* @return
*/
public static String formatDate2Str(Date date, String format) {
if (date == null) {
return null;
}
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
SimpleDateFormat sdf = getSimpleDateFormat(format);
return sdf.format(date);
}
public static Date _toDate(String date, Integer _count) {
String[] dateFormats = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "MM/dd/YYYY" };
try {
if (_count == dateFormats.length) {
return null;
}
return DateUtils.formatStr2Date(date, dateFormats[_count]);
} catch (Exception e) {
return _toDate(date, ++_count);
}
}
/**
* 转换默认格式的时间为Date
*
* @param dateStr
* @return
*/
public static Date formatStr2Date(String dateStr) {
return formatStr2Date(dateStr, null);
}
/**
* 转换指定格式的时间为Date
*
* @param dateStr
* @param format
* @return
*/
public static Date formatStr2Date(String dateStr, String format) {
if (dateStr == null) {
return null;
}
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
SimpleDateFormat sdf = getSimpleDateFormat(format);
Date returnDate = sdf.parse(dateStr, new ParsePosition(0));
if (returnDate == null) {
sdf = getSimpleDateFormat(C_DATE_PATTON_DEFAULT);
returnDate = sdf.parse(dateStr, new ParsePosition(0));
}
if (returnDate == null) {
sdf = getSimpleDateFormat(C_DATE_PATTON_DEFAULT_2);
returnDate = sdf.parse(dateStr, new ParsePosition(0));
}
if (returnDate == null) {
sdf = getSimpleDateFormat(C_DATE_PATTON_DEFAULT_3);
returnDate = sdf.parse(dateStr, new ParsePosition(0));
}
return returnDate;
}
/**
* 转换默认格式的时间为指定格式时间
*
* @param dateStr
* @param defineFormat
* @return
*/
public static String formatDefault2Define(String dateStr, String defineFormat) {
return formatSource2Target(dateStr, C_TIME_PATTON_DEFAULT, defineFormat);
}
/**
* 转换源格式的时间为目标格式时间
*
* @param dateStr
* @param sourceFormat
* @param targetFormat
* @return
*/
public static String formatSource2Target(String dateStr, String sourceFormat, String targetFormat) {
Date date = formatStr2Date(dateStr, sourceFormat);
return formatDate2Str(date, targetFormat);
}
/**
* 计算当天是该年中的第几周
*
* @return
*/
public static int findWeeksNoInYear() {
return findWeeksNoInYear(new Date());
}
/**
* 计算指定日期是该年中的第几周
*
* @param date
* @return
*/
public static int findWeeksNoInYear(Date date) {
if (date == null) {
return 0;
}
return findWeeksNoInYear(date2Calendar(date));
}
/**
* 计算指定日历是该年中的第几周
*
* @param calendar
* @return
*/
public static int findWeeksNoInYear(Calendar calendar) {
if (calendar == null) {
return 0;
}
return calendar.get(Calendar.WEEK_OF_YEAR);
}
/**
* 计算一年中的第几星期是几号
*
* @param year
* @param weekInYear
* @param dayInWeek
* @return
*/
public static Date findDateInWeekOnYear(int year, int weekInYear, int dayInWeek) {
Calendar calendar = Calendar.getInstance();
if (year > 0) {
calendar.set(Calendar.YEAR, year);
}
calendar.set(Calendar.WEEK_OF_YEAR, weekInYear);
calendar.set(Calendar.DAY_OF_WEEK, dayInWeek);
return calendar.getTime();
}
/**
* 相对于当前日期的前几天(days < 000000)或者后几天(days > 0)
*
* @param days
* @return
*/
public static Date dayBefore2Date(int days) {
Date date = new Date();
return dayBefore2Object(days, null, date);
}
/**
* 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
*
* @author wangsf
* @param days
* @return
*/
public static Date dayBefore2Date(Date date, int days) {
return dayBefore2Object(days, null, date);
}
/**
* 相对于指定日期的前几小时(hours < 000000)或者后几小时(hours > 0)
*
* @author wangsf
* @param days
* @return
*/
public static Date hoursBefore2Date(Date date, int hours) {
return hoursBefore2Object(hours, null, date);
}
/**
* 相对于当前日期的前几天(days < 000000)或者后几天(days > 0)
*
* @param days
* @return
*/
public static String dayBefore2Str(int days) {
String string = formatDate2Str();
return dayBefore2Object(days, null, string);
}
/**
* 相对于当前日期的前几天(days < 000000)或者后几天(days > 0)
*
* @author wangsf
* @param days
* @param format
* @param instance
*/
@SuppressWarnings("unchecked")
public static <T extends Object> T dayBefore2Object(int days, String format, T instance) {
Calendar calendar = Calendar.getInstance();
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
if (instance instanceof Date) {
calendar.setTime((Date) instance);
calendar.add(Calendar.DATE, days);// 增加x天
Date date = calendar.getTime();
return (T) date;
} else if (instance instanceof String) {
calendar.add(Calendar.DATE, days);
return (T) formatDate2Str(calendar2Date(calendar), format);
}
return null;
}
/**
* 相对于当前日期的前几小时(hours < 000000)或者后几小时(hours > 0)
*
* @author wangsf
* @param days
* @param format
* @param instance
*/
@SuppressWarnings("unchecked")
public static <T extends Object> T hoursBefore2Object(int hours, String format, T instance) {
Calendar calendar = Calendar.getInstance();
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
if (instance instanceof Date) {
calendar.setTime((Date) instance);
calendar.add(Calendar.HOUR_OF_DAY, hours);// 增加x天
Date date = calendar.getTime();
return (T) date;
} else if (instance instanceof String) {
calendar.add(Calendar.HOUR_OF_DAY, hours);
return (T) formatDate2Str(calendar2Date(calendar), format);
}
return null;
}
/**
* 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
*
* @param date
* @param days
* @return
*/
public static Date defineDayBefore2Date(Date date, int days) {
Date dateInstance = new Date();
return defineDayBefore2Object(date, days, null, dateInstance);
}
/**
* 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
*
* @param date
* @param days
* @return
*/
public static String defineDayBefore2Str(Date date, int days) {
String stringInstance = formatDate2Str();
return defineDayBefore2Object(date, days, null, stringInstance);
}
public static String defineDayBefore2Str(Date date, int days, String format) {
String stringInstance = formatDate2Str();
return defineDayBefore2Object(date, days, format, stringInstance);
}
/**
* 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
*
* @param <T>
* @param date
* @param days
* @param format
* @param instance
* @return
*/
@SuppressWarnings("unchecked")
public static <T extends Object> T defineDayBefore2Object(Date date, int days, String format, T instance) {
if (date == null || days == 0) {
return null;
}
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
Calendar calendar = date2Calendar(date);
calendar.add(Calendar.DATE, days);
if (instance instanceof Date) {
return (T) calendar.getTime();
} else if (instance instanceof String) {
return (T) formatDate2Str(calendar2Date(calendar), format);
}
return null;
}
/**
* 相对于当前日期的前几月(months < 000000)或者后几月(months > 0)时间
*
* @param months
* @return
*/
public static Date monthBefore2Date(int months) {
Date date = new Date();
return monthBefore2Object(months, null, date);
}
/**
* 相对于当前日期的前几月(months < 000000)或者后几月(months > 0)时间
*
* @param months
* @return
*/
public static String monthBefore2Str(int months) {
String string = formatDate2Str();
return monthBefore2Object(months, null, string);
}
/**
* 相对于当前日期的前几月(months < 000000)或者后几月(months > 0)时间
*
* @param <T>
* @param months
* @param format
* @param instance
*/
@SuppressWarnings("unchecked")
public static <T extends Object> T monthBefore2Object(int months, String format, T instance) {
if (months == 0) {
return null;
}
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, months);
if (instance instanceof Date) {
return (T) calendar.getTime();
} else if (instance instanceof String) {
return (T) formatDate2Str(calendar2Date(calendar), format);
}
return null;
}
/**
* 相对于指定日期的前几月(months < 000000)或者后几月(months > 0)时间
*
* @param date
* @param months
* @return
*/
public static Date defineMonthBefore2Date(Date date, int months) {
Date dateInstance = new Date();
return defineMonthBefore2Object(date, months, null, dateInstance);
}
/**
* 相对于指定日期的前几月(months < 000000)或者后几月(months > 0)时间
*
* @param date
* @param months
* @return
*/
public static String defineMonthBefore2Str(Date date, int months) {
String stringInstance = formatDate2Str();
return defineMonthBefore2Object(date, months, null, stringInstance);
}
/**
* 相对于指定日期的前几月(months < 000000)或者后几月(months > 0)时间
*
* @param <T>
* @param date
* @param months
* @param format
* @param instance
* @return
*/
@SuppressWarnings("unchecked")
public static <T extends Object> T defineMonthBefore2Object(Date date, int months, String format, T instance) {
if (months == 0) {
return null;
}
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
Calendar calendar = date2Calendar(date);
calendar.add(Calendar.MONTH, months);
if (instance instanceof Date) {
return (T) calendar.getTime();
} else if (instance instanceof String) {
return (T) formatDate2Str(calendar2Date(calendar), format);
}
return null;
}
/**
* 计算两个日期直接差的天数
*
* 这个计算有错误,只能计算一年之内的,不能跨年
*
* @param firstDate
* @param secondDate
* @return
*/
public static int caculate2Days(Date firstDate, Date secondDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(firstDate);
int dayNum1 = calendar.get(Calendar.DAY_OF_YEAR);
calendar.setTime(secondDate);
int dayNum2 = calendar.get(Calendar.DAY_OF_YEAR);
return Math.abs(dayNum1 - dayNum2);
}
public static int caculateDays(Date firstDate, Date secondDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(firstDate);
long first = calendar.getTimeInMillis();
calendar.setTime(secondDate);
long second = calendar.getTimeInMillis();
return (int) Math.abs((first - second) / (1000 * 60 * 60 * 24));
}
/**
* 计算两个日期直接差的天数 ,返回有正负
*
* @param firstDate
* @param secondDate
* @return
*/
public static int caculate2DaysOther(Date firstDate, Date secondDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(firstDate);
int dayNum1 = calendar.get(Calendar.DAY_OF_YEAR);
calendar.setTime(secondDate);
int dayNum2 = calendar.get(Calendar.DAY_OF_YEAR);
return dayNum1 - dayNum2;
}
/**
* 计算两个日期直接差天数精确值 考虑到年。
*
* @param firstDate
* @param secondDate
* @return
*/
public static int caculate2days(Date firstDate, Date secondDate) {
// 默认为毫秒,除以1000是为了转换成秒
long interval = (firstDate.getTime() - secondDate.getTime()) / 1000;// 秒
long day = interval / (24 * 3600);// 天
long hour = interval % (24 * 3600) / 3600;// 小时
long minute = interval % 3600 / 60;// 分钟
long second = interval % 60;// 秒
if (hour > 0 || minute > 0 || second > 0) {
day++;
}
return (int) day;
}
/**
* 计算两个日期直接差的天数
*
* @param firstCalendar
* @param secondCalendar
* @return
*/
public static int caculate2Days(Calendar firstCalendar, Calendar secondCalendar) {
if (firstCalendar.after(secondCalendar)) {
Calendar calendar = firstCalendar;
firstCalendar = secondCalendar;
secondCalendar = calendar;
}
long calendarNum1 = firstCalendar.getTimeInMillis();
long calendarNum2 = secondCalendar.getTimeInMillis();
return Math.abs((int) ((calendarNum1 - calendarNum2) / C_ONE_DAY));
}
/**
* @author wangsf 获得当前日期所在周的最后一天.
* @return
*/
public static Date getWeekEndDay(final Date fromDate) {
Date toDate = null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(fromDate);
int tempWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (tempWeek == 1) {
toDate = fromDate;
} else {
tempWeek = 7 - (tempWeek - 1);
toDate = DateUtils.defineDayBefore2Object(fromDate, tempWeek, DateUtils.C_DATE_PATTON_DEFAULT, new Date());
}
return toDate;
}
/**
* @author wangsf 获得当前日期所在月的最后一天.
* @return
*/
public static Date getMonthEndDay(final Date fromDate) {
Date toDate = null;
int maxDay = DateUtils.findMaxDayInMonth(fromDate);
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
String maxDayStr = maxDay < 10 ? "0" + maxDay : "" + maxDay;
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 8) + maxDayStr, "yyyy-MM-dd");
return toDate;
}
/**
* @author wangsf 获得当前日期所在季度的最后一天.
* @return
*/
public static Date getQuarterEndDay(final Date fromDate) {
Date toDate = null;
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
int iMaxMonth = iMonth + 2;
/*
* if (iMonth <= 3) { iMaxMonth = 3; } else if (iMonth <= 6) { iMaxMonth
* = 6; } else if (iMonth <= 9) { iMaxMonth = 9; } else { iMaxMonth =
* 12; }
*/
String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
Date quarter = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr, "yyyy-MM");
int maxDay = DateUtils.findMaxDayInMonth(quarter);
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + maxDay, "yyyy-MM-dd");
return toDate;
}
/**
* @author mingrs 获得当前日期所在季度的第一天.
* @return
*/
public static Date getQuarterStartDay(final Date fromDate) {
Date toDate = null;
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
int iMaxMonth = iMonth;
/*
* if (iMonth <= 3) { iMaxMonth = 1; } else if (iMonth <= 6) { iMaxMonth
* = 4; } else if (iMonth <= 9) { iMaxMonth = 7; } else { iMaxMonth =
* 10; }
*/
String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + "01", "yyyy-MM-dd");
return toDate;
}
/**
* @author mingrs 获得当前日期所在半年的最后一天.
* @return
*/
public static Date getLast6MonthsEndDay(final Date fromDate) {
Date toDate = null;
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
int iMaxMonth = iMonth + 5;
/*
* if (iMonth <= 6) { iMaxMonth = 6; } else { iMaxMonth = 12; }
*/
String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
Date quarter = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr, "yyyy-MM");
int maxDay = DateUtils.findMaxDayInMonth(quarter);
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + maxDay, "yyyy-MM-dd");
return toDate;
}
/**
* @author mingrs 获得当前日期所在半年的第一天.
* @return
*/
public static Date getLast6MonthsStartDay(final Date fromDate) {
Date toDate = null;
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
int iMaxMonth = iMonth;
/*
* if (iMonth <= 6) { iMaxMonth = 1; } else { iMaxMonth = 7; }
*/
String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
// Date quarter = DateUtils.formatStr2Date(fromDateStr.substring(0, 5)
// + monthStr, "yyyy-MM");
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + "01", "yyyy-MM-dd");
return toDate;
}
/**
* @author wangsf 获得当前日期所在年的最后一天.
* @return
*/
public static Date getYearEndDay(final Date fromDate) {
Date toDate = null;
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
Date lastMonth = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + "12", "yyyy-MM");
int maxDay = DateUtils.findMaxDayInMonth(lastMonth);
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + 12 + "-" + maxDay, "yyyy-MM-dd");
return toDate;
}
/**
* @author mingrs 获得当前日期所在年的第一天.
* @return
*/
public static Date getYearStartDay(final Date fromDate) {
Date toDate = null;
String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + 01 + "-" + 01, "yyyy-MM-dd");
return toDate;
}
/**
* 根据传过来的时间值返回AM, 或PM;
*
* @param time 如: 08:00:00
* @return
*/
public static String getAPM(String time) {
if (time == null || time.trim().length() < 1) {
return "";
}
if (time.equals("12:00:00")) {
return "AM";
}
Integer hTime = Integer.parseInt(time.substring(0, 2));
if (hTime >= 12) {
return "PM";
}
return "AM";
}
/**
* 根据传过来的时间返回AM,PM对应的值, 并保留相应长度.
*
* @param time 如: 08:00:00
* @param length 如: 5,则返回 08:00;
* @return
*/
public static String getAPMTime(String time, int length) {
if (time == null || time.trim().length() < 1) {
return "";
}
String amPm = DateUtils.getAPM(time);
Integer hTime = Integer.parseInt(time.substring(0, 2));
String minAndSec = time.substring(2);
String realTime;
if (amPm.equalsIgnoreCase("AM")) {
realTime = time;
} else {
hTime = hTime - 12;
if (hTime < 10) {
realTime = "0" + hTime + minAndSec;
} else {
realTime = hTime + minAndSec;
}
}
realTime = realTime.substring(0, length);
return realTime;
}
public static String apmStr2Time(String timeStr, String apm) {
if (timeStr == null || timeStr.trim().length() < 1 || apm == null) {
return null;
}
String realTime;
if (apm.equalsIgnoreCase("AM")) {
realTime = timeStr;
} else {
String minAndSec = timeStr.substring(2);
Integer hTime = Integer.parseInt(timeStr.substring(0, 2));
hTime = hTime + 12;
realTime = hTime + minAndSec;
}
realTime += ":00";
if (realTime.equals("24:00:00")) {
return "00:00:00";
}
return realTime;
}
private static int getMondayPlus() {
Calendar cd = Calendar.getInstance();
// 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == 1) {
return -6;
} else {
return 2 - dayOfWeek;
}
}
/**
* 获得上周星期一的日期
*
* @author golf
* @return String
*/
public static String getPreviousMonday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus - 7);
Date monday = currentDate.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String preMonday = sdf.format(monday);
return preMonday;
}
/**
* 获得上周星期日的日期
*
* @author golf
* @return String
*/
public static String getPreviousSunday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus - 1);
Date monday = currentDate.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String preSunday = sdf.format(monday);
return preSunday;
}
/**
* 获得本周星期一的日期
*
* @author golf
* @return
*/
public static String getCurrentMonday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus);
Date monday = currentDate.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currMonday = sdf.format(monday);
return currMonday;
}
/**
*
* @Description: 获得本周星期日的日期 @author WangXiao @param @return String @throws
*/
public static String getCurrentSunday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus + 6);
Date monday = currentDate.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String preMonday = sdf.format(monday);
return preMonday;
}
/**
* 获得上月的第一天的日期
*
* @author golf
* @return
*/
public static String getLastMonth() {
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.MONTH, -1);
currentDate.set(GregorianCalendar.DAY_OF_MONTH, 1);
Date day = currentDate.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String lastMonth = sdf.format(day);
return lastMonth;
}
/**
* 取得指定月份的第一天
*
* @author golf
* @param strdate String
* @return String
*/
public static String getFirstDayOfMonth(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date day = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(day);
}
/**
* 取得指定月份的最后一天
*
* @author golf
* @param strdate String
* @return String
*/
public static String getLastDayOfMonth(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.roll(Calendar.DAY_OF_MONTH, -1);
Date day = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(day);
}
/*
* public static void main(String[] args) { //
* System.out.println("当前月份的最大天数:" + findMaxDayInMonth(new Date())); //
* System.out.println("6月份的最大天数:" + findMaxDayInMonth(6)); //
* System.out.println("1999-02月份的最大天数:" + findMaxDayInMonth(1999, 2)); //
* System.out.println("2000-02月份的最大天数:" + findMaxDayInMonth(2000, 2));
*
* // System.out.println(formatSource2Target("2009-07-24 11:02:35", null, //
* "yyyy/MM/dd")); // System.out.println(findWeeksNoInYear());
*
* // System.out.println("2003年的第30个星期一是那天:" + findDateInWeekOnYear(2003, //
* 30, Calendar.MONDAY)); // System.out.println("2009年的第30个星期一是那天:" +
* findDateInWeekOnYear(2009, // 30, Calendar.FRIDAY));
*
* // System.out.println("【日期格式】当前日期的前7天是:" + dayBefore2Date(-7)); //
* System.out.println("【字符格式】当前日期的前7天是:" + dayBefore2Str(-7)); //
* System.out.println("【日期格式】当前日期的后7天是:" + dayBefore2Date(7)); //
* System.out.println("【字符格式】当前日期的后7天是:" + dayBefore2Str(7));
*
* // System.out.println(formatStr2Date("2009-07-22", "yyyy-MM-dd"));
*
* // System.out.println("【日期格式】2009-07-22的前7天是:" + //
* defineDayBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), // -7));
* // System.out.println("【字符格式】2009-07-22的前7天是:" + //
* defineDayBefore2Str(formatStr2Date("2009-07-22", "yyyy-MM-dd"), -7)); //
* System.out.println("【日期格式】2009-07-22的后7天是:" + //
* defineDayBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), 7)); //
* System.out.println("【字符格式】2009-07-22的后7天是:" + //
* defineDayBefore2Str(formatStr2Date("2009-07-22", "yyyy-MM-dd"), 7));
*
* // System.out.println("【日期格式】相对于当前时间的前2月日期是:" + monthBefore2Date(-2)); //
* System.out.println("【字符格式】相对于当前时间的前2月日期是:" + monthBefore2Date(-2)); //
* System.out.println("【日期格式】相对于当前时间的后2月日期是:" + monthBefore2Date(2)); //
* System.out.println("【字符格式】相对于当前时间的后2月日期是:" + monthBefore2Date(2));
*
* // System.out.println("【日期格式】2009-07-22的前2月日期是:" + //
* defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
* -2)); // System.out.println("【字符格式】2009-07-22的前2月日期是:" + //
* defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
* -2)); // System.out.println("【日期格式】2009-07-22的后2月日期是:" + //
* defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
* 2)); // System.out.println("【字符格式】2009-07-22的后2月日期是:" + //
* defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
* 2));
*
* // Date firstDate = formatStr2Date("2009-07-22", "yyyy-MM-dd"); // Date
* secondDate = formatStr2Date("2009-07-18", "yyyy-MM-dd"); //
* System.out.println(caculate2Days(firstDate, secondDate));
*
* Calendar firstC = date2Calendar(formatStr2Date("2009-07-22",
* "yyyy-MM-dd")); Calendar secondC =
* date2Calendar(formatStr2Date("2009-07-18", "yyyy-MM-dd"));
* System.out.println(caculate2Days(firstC, secondC)); }
*/
/**
* 说明:把Date对象转为XMLGregorianCalendar
*
* @author Golf
*
* @return XMLGregorianCalendar
*/
public static XMLGregorianCalendar convertToXMLGregorianCalendar(Date date) {
if (date != null) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar gc = null;
try {
gc = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
} catch (Exception e) {
e.printStackTrace();
}
return gc;
}
return null;
}
/**
* fangquan 根据某年的第几周得到开始和结束日期
*/
public static String[] getWeeklyDate(int year, int week) {
String[] s = new String[2];
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar calFirstDayOfTheYear = new GregorianCalendar(year, Calendar.JANUARY, 1);
calFirstDayOfTheYear.add(Calendar.DATE, 7 * (week));
int dayOfWeek = calFirstDayOfTheYear.get(Calendar.DAY_OF_WEEK);
Calendar calFirstDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
calFirstDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMinimum(Calendar.DAY_OF_WEEK) - dayOfWeek);
Date firstDayInWeek = calFirstDayInWeek.getTime();
s[0] = df.format(firstDayInWeek);
Calendar calLastDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
calLastDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMaximum(Calendar.DAY_OF_WEEK) - dayOfWeek);
Date lastDayInWeek = calLastDayInWeek.getTime();
s[1] = df.format(lastDayInWeek);
return s;
}
/**
* fangquan 根据某年的第几周得到开始和结束日期
*/
public static String[] getWeeklyDate2(int year, int week) {
String[] s = new String[2];
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
Calendar calFirstDayOfTheYear = new GregorianCalendar(year, Calendar.JANUARY, 1);
calFirstDayOfTheYear.add(Calendar.DATE, 7 * (week));
int dayOfWeek = calFirstDayOfTheYear.get(Calendar.DAY_OF_WEEK);
Calendar calFirstDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
calFirstDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMinimum(Calendar.DAY_OF_WEEK) - dayOfWeek);
Date firstDayInWeek = calFirstDayInWeek.getTime();
s[0] = df.format(firstDayInWeek);
Calendar calLastDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
calLastDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMaximum(Calendar.DAY_OF_WEEK) - dayOfWeek);
Date lastDayInWeek = calLastDayInWeek.getTime();
s[1] = df.format(lastDayInWeek);
return s;
}
/**
* fangquan 根据某年的第几月得到开始和结束日期
*/
public static String[] getMonthlyDate2(int year, int month) {
String[] s = new String[2];
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
Date date = formatStr2Date(year + "-" + month + "-01", "yyyy-MM-dd");
s[0] = df.format(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DAY_OF_YEAR, -1);
s[1] = df.format(calendar.getTime());
return s;
}
/**
*
* @Description: 计算任意2个日期内的自然日(没有考虑到国定假日) @author WangXiao @param d1 @param
* d2 @param @return @return int @throws
*/
public static int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) {
if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}
int days = d2.get(java.util.Calendar.DAY_OF_YEAR) - d1.get(java.util.Calendar.DAY_OF_YEAR);
int y2 = d2.get(java.util.Calendar.YEAR);
if (d1.get(java.util.Calendar.YEAR) != y2) {
d1 = (java.util.Calendar) d1.clone();
do {
days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);
d1.add(java.util.Calendar.YEAR, 1);
} while (d1.get(java.util.Calendar.YEAR) != y2);
}
return days;
}
/**
*
* @Description: 计算2个日期之间的工作日天数 @author WangXiao @param d1 @param
* d2 @param @return @return int @throws
*/
public static int getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) {
int result = -1;
if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}
int charge_start_date = 0;// 开始日期的日期偏移量
int charge_end_date = 0;// 结束日期的日期偏移量
// 日期不在同一个日期内
int stmp;
int etmp;
stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
if (stmp != 0 && stmp != 6) {// 开始日期为星期六和星期日时偏移量为0
charge_start_date = stmp - 1;
}
if (etmp != 0 && etmp != 6) {// 结束日期为星期六和星期日时偏移量为0
charge_end_date = etmp - 1;
}
result = (getDaysBetween(getNextMonday(d1), getNextMonday(d2)) / 7) * 5 + charge_start_date - charge_end_date;
return result;
}
public static String getChineseWeek(Calendar date) {
final String dayNames[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
return dayNames[dayOfWeek - 1];
}
/**
*
* @Description: 获得下周一日期 @author WangXiao @param date @param @return @return
* Calendar @throws
*/
public static Calendar getNextMonday(Calendar date) {
Calendar result = null;
result = date;
do {
result = (Calendar) result.clone();
result.add(Calendar.DATE, 1);
} while (result.get(Calendar.DAY_OF_WEEK) != 2);
return result;
}
/**
*
* @Description: 计算两个日期之间的休息日 @author WangXiao @param d1 @param
* d2 @param @return @return int @throws
*/
public static int getHolidays(Calendar d1, Calendar d2) {
return getDaysBetween(d1, d2) - getWorkingDay(d1, d2);
}
/**
* @author WangXiao
* @param 19位的时间 yyyy-MM-dd HH:mm:ss
* @return 15位的时间 yyyyMMdd HHmmss
*/
public static String time19To15(String time_19) {
String time_15 = "";
if (time_19 == null || "".equals(time_19) || time_19.length() != 19) {
time_15 = "";
} else {
String[] r = time_19.replace('-', '#').replace(':', '#').split("#");
for (int i = 0; i < r.length; i++) {
time_15 += r[i];
}
}
return time_15;
}
/**
* @author WangXiao
* @param 15位的时间 yyyyMMdd HHmmss
* @return 19位的时间 yyyy-MM-dd HH:mm:ss
*/
public static String time15To19(String time_15) {
String time_19 = "";
if (time_15 == null || "".equals(time_15) || time_15.length() != 15) {
time_19 = "";
} else {
String y = time_15.substring(0, 4);
String m = time_15.substring(4, 6);
String d = time_15.substring(6, 8);
String h = time_15.substring(9, 11);
String mi = time_15.substring(11, 13);
String s = time_15.substring(13, 15);
time_19 = y + "-" + m + "-" + d + " " + h + ":" + mi + ":" + s;
}
return time_19;
}
/**
* @author WangXiao
* @param 16位的时间 yyyy-MM-dd HH:mm
* @return 13位的时间 yyyyMMdd HHmm
*/
public static String time16To13(String time_16) {
String time_13 = "";
if (time_16 == null || "".equals(time_16) || time_16.length() != 16) {
time_13 = "";
} else {
String[] r = time_16.replace('-', '#').replace(':', '#').split("#");
for (int i = 0; i < r.length; i++) {
time_13 += r[i];
}
}
return time_13;
}
/**
* @author WangXiao
* @param 13位的时间 yyyyMMdd HHmm
* @return 16位的时间 yyyy-MM-dd HH:mm
*/
public static String time13To16(String time_13) {
String time_16 = "";
if (time_13 == null || "".equals(time_13) || time_13.length() != 13) {
time_16 = "";
} else {
String y = time_13.substring(0, 4);
String m = time_13.substring(4, 6);
String d = time_13.substring(6, 8);
String h = time_13.substring(9, 11);
String mi = time_13.substring(11, 13);
time_16 = y + "-" + m + "-" + d + " " + h + ":" + mi;
}
return time_16;
}
/**
* @author WangXiao
* @param 10位的日期 yyyy-MM-dd
* @return 8位的日期 yyyyMMdd
*/
public static String date10To8(String date_10) {
String date_8 = "";
if (date_10 == null || "".equals(date_10) || date_10.length() != 10) {
date_8 = "";
} else {
String[] r = date_10.split("-");
for (int i = 0; i < r.length; i++) {
date_8 += r[i];
}
}
return date_8;
}
/**
* @author WangXiao
* @param 8位的日期 yyyyMMdd
* @return 10位的日期 yyyy-MM-dd
*/
public static String date8To10(String date_8) {
String date_10 = "";
if (date_8 == null || "".equals(date_8) || date_8.length() != 8) {
date_10 = "";
} else {
String y = date_8.substring(0, 4);
String m = date_8.substring(4, 6);
String d = date_8.substring(6, 8);
date_10 = y + "-" + m + "-" + d;
}
return date_10;
}
/**
* @author WangXiao
* @param 7位的日期 yyyy-MM
* @return 6位的日期 yyyyMM
*/
public static String date7To6(String date_7) {
String date_6 = "";
if (date_7 == null || "".equals(date_7) || date_7.length() != 7) {
date_6 = "";
} else {
String[] r = date_7.split("-");
for (int i = 0; i < r.length; i++) {
date_6 += r[i];
}
}
return date_6;
}
/**
* @author WangXiao
* @param 6位的日期 yyyyMM
* @return 7位的日期 yyyy-MM
*/
public static String date6To7(String date_6) {
String date_7 = "";
if (date_6 == null || "".equals(date_6) || date_6.length() != 6) {
date_7 = "";
} else {
String y = date_6.substring(0, 4);
String m = date_6.substring(4, 6);
date_7 = y + "-" + m;
}
return date_7;
}
public static Date getMonthDay(int year, int month) {
if (month >= 10)
return formatStr2Date(year + "-" + month + "-01", DateUtils.C_DATE_PATTON_DEFAULT);
else
return formatStr2Date(year + "-0" + month + "-01", DateUtils.C_DATE_PATTON_DEFAULT);
}
/**
* 将时间转为目标时区时间
*
* @param curr
* @param fromZone
* @return
*/
public static Date getTargetTimeZoneDate(Date curr, String toZone) {
TimeZone time = TimeZone.getTimeZone(toZone);
TimeZone currTime = TimeZone.getDefault();
return getTargetTimeZoneDate(curr, currTime, time);
}
public static Date getTargetTimeZoneDate(Date date, TimeZone fromZone, TimeZone toZone) {
int deltHour = (toZone.getRawOffset() - fromZone.getRawOffset()) / 3600000;
Date targetDate = DateUtils.hoursBefore2Date(date, deltHour);
return targetDate;
}
public static Date convertToDate(XMLGregorianCalendar cal) throws Exception {
GregorianCalendar ca = cal.toGregorianCalendar();
return ca.getTime();
}
public static Date getTargetTimeZoneDateSummer(Date date, TimeZone fromZone, TimeZone toZone) {
int deltHour = (toZone.getRawOffset() - fromZone.getRawOffset()) / 3600000;
if (deltHour > 0) {
deltHour = deltHour - 1;
} else {
deltHour = deltHour + 1;
}
Date targetDate = DateUtils.hoursBefore2Date(date, deltHour);
return targetDate;
}
/**
* @author wangsf 获得当前日期所在周的最后一天.判断是否跨年
*
* @return
*/
public static Date getWeekEndDay(final Date fromDate, final Date toDate) {
Date reDate = null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(toDate);
int tempWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (tempWeek == 1) {
reDate = toDate;
} else {
tempWeek = 7 - (tempWeek - 1);
reDate = DateUtils.defineDayBefore2Object(toDate, tempWeek, DateUtils.C_DATE_PATTON_DEFAULT, new Date());
}
// 判断跨年
if (fromDate.getYear() < toDate.getYear()) {
reDate = DateUtils.getYearEndDay(fromDate);
}
return reDate;
}
/**
* 根据当前时间判断是星期几
*/
public static int dayForWeek(Date date) throws Exception {
if (date == null)
return 0;
else {
Calendar c = Calendar.getInstance();
c.setTime(date);
int dayForWeek = 0;
if (c.get(Calendar.DAY_OF_WEEK) == 1) {
dayForWeek = 7;
} else {
dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
}
return dayForWeek;
}
}
/**
* 比较两个日期之间的大小
*
* @param d1
* @param d2
* @return 前者大于后者返回true 反之false
*/
public static boolean compareDate(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
int result = c1.compareTo(c2);
if (result >= 0) {
return true;
} else {
return false;
}
}
public static String addDay(Date paramDate, int n) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cd = Calendar.getInstance();
cd.setTime(paramDate);
// cd.add(Calendar.DATE, n);//增加一天
cd.add(Calendar.MONTH, n);// 增加一个月
return sdf.format(cd.getTime());
} catch (Exception e) {
return null;
}
}
/**
* 从orerservice.java移过来的,Created by fangquan
* @param date
* @return
*/
public static String getUsaDate(String date) {
Calendar Cal = Calendar.getInstance();
Date d1 = DateUtils.formatStr2Date(date, "yyyy-MM-dd");
Cal.setTime(d1);
Cal.add(Calendar.HOUR_OF_DAY, -24);
Date d2 = DateUtils.calendar2Date(Cal);
return DateUtils.formatDate2Str(d2);
}
/**
*
* 获取ISO861 format 时间格式<br>
*
* @return
* @see
* @since
*/
public static String formatTimeStamp() {
String timeStamp = formatDate2Str(new Date());
timeStamp = timeStamp.replaceAll(" ", "T");
timeStamp += "-08:00";
return timeStamp;
}
/**
*
* 〈日期格式化〉<br>
* 〈将格林威治时间格式为指定日期格式数据〉
*
* @param dateStr
* @return
* @see
* @since
* @author zhangyong
*/
public static String formateGLWZDate(String dateStr, String format) {
String returnDateMsg = null;
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
try {
Date date = sdf.parse(dateStr);
if (StringUtils.isBlank(format)) {
format = DateUtils.C_TIME_PATTON_DEFAULT;
}
sdf = new SimpleDateFormat(format);
returnDateMsg = sdf.format(date);
} catch (ParseException e) {
e.printStackTrace();
}
return returnDateMsg;
}
/**
*
* @param date
* @param amount
* @return mengfanxin 2016/6/2
*/
public static Date addYears(Date date, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.YEAR, amount);
return calendar.getTime();
}
/**
* 相对于指定日期的前几年(years < 000000)或者后几年(years > 0)时间
*
*/
@SuppressWarnings("unchecked")
public static <T extends Object> T defineYearBefore2Object(Date date, int years, String format, T instance) {
if (years == 0) {
return null;
}
if (format == null || format.equals("")) {
format = C_TIME_PATTON_DEFAULT;
}
Calendar calendar = date2Calendar(date);
calendar.add(Calendar.YEAR, years);
if (instance instanceof Date) {
return (T) calendar.getTime();
} else if (instance instanceof String) {
return (T) formatDate2Str(calendar2Date(calendar), format);
}
return null;
}
/**
* 相对于指定日期的前几年(years < 000000)或者后几年(years > 0)时间
*
*/
public static Date defineYearBefore2Date(Date date, int years) {
Date dateInstance = new Date();
return defineYearBefore2Object(date, years, null, dateInstance);
}
/**
* 相对于指定日期的前几年(years < 000000)或者后几年(years > 0)时间
*
*/
public static String defineYearBefore2Str(Date date, int years) {
String stringInstance = formatDate2Str();
return defineMonthBefore2Object(date, years, null, stringInstance);
}
}