1. 程式人生 > >時間處理工具類

時間處理工具類

nim mount minute int quest lac asn ren 問題

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.xml.datatype.XMLGregorianCalendar;

public class DateUtils extends org.apache.commons.lang.time.DateUtils
{

public DateUtils()
{
}
//獲取當前時間Date類型
public static Date currentDate()
{
return new Date();
}
//獲取當前時間String類型
public static String currentString()
{
return format(currentDate());
}
//獲取當前時間的日歷類
public static Calendar getCalendar()
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
return calendar;
}
//Date類型的時間轉換成日歷類
public static Calendar getCalendar(Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
//自 1970.1.1 00:00:00 GMT +毫秒數=新的日歷
//同方法getMany中②③
public static Calendar getCalendar(long millis)
{
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(millis);
return calendar;
}
//java.sql.Date類型的時間轉換成日歷類
public static Calendar getCalendar(java.sql.Date date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(date.getTime());
return calendar;
}
/**
* 時間戳轉換成日歷
* @param date
* @return
*/
public static Calendar getCalendar(Timestamp date)
{
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(date.getTime());
return calendar;
}
//獲得該日歷所屬的星期:WEEK[1]:星期一,WEEK[2]:星期二,依此類推
public static String getWeek(Calendar calendar)
{
return WEEK[calendar.get(7) - 1];//calendar.get(7)所屬一周中的第幾天:周末為1;周一為2,以此類推
}
//格式轉換Date——String(yyyy-MM-dd HH:mm:ss)
public static String format(Date date)
{
return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
}
//按指定格式獲取當前日期:String類型
public static String format(String pattern)
{
return (new SimpleDateFormat(pattern)).format(currentDate());
}
//把日期類型的時間轉換成指定格式的String類型
public static String format(String pattern, Date date)
{
return (new SimpleDateFormat(pattern)).format(date);
}
//把sql日期類型的時間轉換成指定格式的String類型
public static String format(String pattern, java.sql.Date date)
{
return (new SimpleDateFormat(pattern)).format(new Date(date.getTime()));
}
//把時間戳類型的時間轉換成指定格式的String類型
public static String format(String pattern, Timestamp date)
{
return (new SimpleDateFormat(pattern)).format(new Date(date.getTime()));
}
//
public static String format(String request, String date, String result)
throws ParseException
{
return format(result, parse(request, date));
}
//把String類型的時間準換成Date類型
public static Date parse(String date)
throws ParseException
{
return parseDate(date, patterns);
}
//把String類型的時間轉換成指定格式的Date類型
public static Date parse(String pattern, String date)
throws ParseException
{
return (new SimpleDateFormat(pattern)).parse(date);
}
//date類型的時間+時+分+秒
public static Date parse(Date date, int hour, int minute, int second, int millis)
{
Calendar retval = getCalendar(date);
retval.set(11, hour);
retval.set(12, minute);
retval.set(13, second);
retval.set(14, millis);
return retval.getTime();
}
//String類型的時間+時+分+秒:顯示為制定格式的Date類型的時間
public static Date parse(String date, String pattern, int hour, int minute, int second, int millis)
throws ParseException
{
Calendar retval = getCalendar(parse(pattern, date));
retval.set(11, hour);
retval.set(12, minute);
retval.set(13, second);
retval.set(14, millis);
return retval.getTime();
}
//給指定的時間加上或減去某時間:(amount)指定量,給定日歷字段(field),
public static Date add(Date date, int field, int amount)
{
return add(getCalendar(date), field, amount).getTime();
}
//給指定的日歷加上或減去某時間:(amount)指定量,給定日歷字段(field),基於日歷的規則。
public static Calendar add(Calendar date, int field, int amount)
{
// Calendar cal = Calendar.getInstance();
// // print current date:The current date is : Thu Apr 26 02:13:28 EEST 2012
// System.out.println("The current date is : " + cal.getTime());
// // add 20 days to the calendar:20 days later: Wed May 16 02:13:28 EEST 2012
// cal.add(Calendar.DATE, 20);
// System.out.println("20 days later: " + cal.getTime());
// // subtract 2 months from the calendar:2 months ago: Fri Mar 16 02:13:28 EET 2012
// cal.add(Calendar.MONTH, -2);
// System.out.println("2 months ago: " + cal.getTime());
// // subtract 5 year from the calendar:5 years ago: Fri Mar 16 02:13:28 EET 2007
// cal.add(Calendar.YEAR, -5);
// System.out.println("5 years ago: " + cal.getTime());

//field -- 日歷字段。amount --要添加到該字段的日期或時間的量。
date.add(field, amount);
return date;
}
//XMLGregorianCalendar轉換成Date類型
public static Date convert(XMLGregorianCalendar calendar)
{
GregorianCalendar retval = calendar.toGregorianCalendar();
return retval.getTime();
}
//Calendar轉換成Date類型
public static Date convert(Calendar calendar)
{
return calendar.getTime();
}
//Timestamp類型轉換成Date類型
public static Date convert(Timestamp timestamp)
{
return new Date(timestamp.getTime());
}
//java.sql.Date轉換成Date類型
public static Date convert(java.sql.Date date)
{
return new Date(date.getTime());
}
//毫秒轉換成Date類型
public static Date convert(String millisecond)
{
return new Date(Long.valueOf(millisecond).longValue());
}
//判斷日歷是否是周末
public static Boolean isWeekend(Calendar calendar)
{
/**
* 跟進去的源碼:
* public final static int DAY_OF_WEEK = 7;所以get(7)是得到當天屬於一周的第幾天,默認周末返回1,周一返回2
* Field number for <code>get</code> and <code>set</code> indicating the day
* of the week. This field takes values <code>SUNDAY</code>,
* <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>,
* <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code>.
**/
//同理:cal.get(1):得到的是現在是哪一年;cal.get(2):得到的是現在月份的前一個月;cal.get(5):得到的是現在的那一天;cal.get(6):屬於一年中的第幾天等等
//java.util.Calendar.get(int field) 方法返回給定日歷字段的值。field -- 給定日歷字段:Calendar.YEAR/MONTH/DATE:年/前一個月份/日
//異常:ArrayIndexOutOfBoundsException - 如果指定的字段超出範圍
int day = calendar.get(7);
if(day != 1 && day != 7)//1為周末,7為周六
return Boolean.valueOf(false);
else
return Boolean.valueOf(true);
}
//判斷date類型的時間是否是周末:先轉換成日歷格式,再判斷
public static Boolean isWeekend(Date date)
{
return isWeekend(getCalendar(date));
}
//判斷java.sql.Date類型的時間是否是周末:先轉換成日歷格式,再判斷
public static Boolean isWeekend(java.sql.Date date)
{
return isWeekend(getCalendar(date));
}
////判斷Timestamp類型的時間是否是周末:先轉換成日歷格式,再判斷
public static Boolean isWeekend(Timestamp date)
{
return isWeekend(getCalendar(date));
}
//計算兩個日歷之前的天數
public static int betweenDays(Calendar start, Calendar end)
{
if(start == null || end == null || start.after(end))
return -1;
/**public final static int DAY_OF_YEAR = 6;Calendar.get(6):得到該時間屬於一年當中第幾天
* Field number for <code>get</code> and <code>set</code> indicating the day
* number within the current year. The first day of the year has value 1.
*/
int days = end.get(6) - start.get(6);

if(start.get(1) != end.get(1))//判斷若不屬於同一年份
{
start = (Calendar)start.clone();
do
{
days += start.getActualMaximum(6);//查詢當前天數(年、月、周)擁有的最大值。
start = add(start, 1, 1);//每次加一年
} while(start.get(1) != end.get(1));//當start.get(1) = end.get(1)時,結束循環
}
return days;
}
//計算兩個日歷之間的天數
public static int betweenWorkDays(Calendar start, Calendar end)
{
return betweenWorkDays(start, end, null, null);
}
//計算兩個日歷之間的工作日天數
public static int betweenWorkDays(Calendar start, Calendar end, List workday, List restday)
{
if(start == null || end == null || start.after(end))
return -1;
//如果是周六日,直接返回0,否則返回7-該日歷屬於一周中第幾天(周日屬於第一天,周一屬於第二天)
int _start_displace = isWeekend(start).booleanValue() ? 0 : 7 - start.get(7);
//如果是周六日,直接返回0,否則返回7-一周中第幾天-1(周日屬於第一天,周一屬於第二天)
int _end_displace = isWeekend(end).booleanValue() ? 0 : 7 - end.get(7) - 1;//
//(起始日歷的下個周一 和 結束日歷的下個周一 之間的天數)/7*5+_start_displace-_end_displace
int days = ((betweenDays(getNextMonday(start), getNextMonday(end)) / 7) * 5 + _start_displace) - _end_displace;
if(workday != null && !workday.isEmpty())
days += betweenHolidayDays(start, end, workday);
if(restday != null && !restday.isEmpty())
days -= betweenHolidayDays(start, end, restday);
return days;
}
//計算兩個日歷之間的時間在holidays列表中存在的的假期天數
public static int betweenHolidayDays(Calendar start, Calendar end, List holidays)
{
int retval = 0;
for(Iterator iterator = holidays.iterator(); iterator.hasNext();)
{
Date date = (Date)iterator.next();
Calendar temp = getCalendar(date);
if((temp.after(start) || temp.compareTo(start) == 0) && (end.after(temp) || end.compareTo(temp) == 0))
retval++;
}

return retval;
}
//獲取該日期的下個周一的日歷
public static Calendar getNextMonday(Calendar date)
{
date = (Calendar)date.clone();
do
date = add(date, 5, 1);//每次加一天
while(date.get(7) != 2);//當該日期不是周一的時候一直循環
return date;
}
//獲取輸入日期所屬那周的周一的日期
public static Date getMonday(Date date)
{
Calendar day = Calendar.getInstance();
day.setTime(date);
day.set(7, 2);
return day.getTime();
}
//獲取某日期所屬那周的周末的日期
public static Date getSunday(Date date)
{
Calendar day = Calendar.getInstance();
day.setTime(date);
if(7 == day.getFirstDayOfWeek())
{
return date;
} else
{
day.add(6, 7);
day.set(7, 1);//{設置周(7)為所屬那周的第一天:周末
return day.getTime();
}
}
//獲取當前日期所屬月份的第一天的日期
public static Date getMonthFirstDay()
{
Calendar calendar = Calendar.getInstance();
calendar.set(5, calendar.getActualMinimum(5));
return calendar.getTime();
}
//獲取當前日期所屬月份的最後一天的日期
public static Date getMonthLastDay()
{
Calendar calendar = Calendar.getInstance();
calendar.set(5, calendar.getActualMaximum(5));
return calendar.getTime();
}

public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static final String DAY_PATTERN = "yyyy-MM-dd";
//因為編碼問題,ISO-8859-1(國際通用編碼),中文會顯示為"\u65E5"的字符
public static final String WEEK[] = {
"\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"
};
public static final String patterns[] = {
"EEE MMM dd HH:mm:ss zzz yyyy", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH", "yyyy-MM-dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH", "yyyy/MM/dd", "yyyyMMddHHmmss",
"yyyyMMddHHmm", "yyyyMMddHH", "yyyyMMdd", "MM/dd/yyyy HH:mm:ss", "MM/dd/yyyy HH:mm", "MM/dd/yyyy HH", "MM/dd/yyyy", "yyyyMM", "yyyy", "yyyy|MM|dd"
};




//①獲取當前系統時間的毫秒數②自 1970.1.1 00:00:00 GMT +固定毫秒數=某時間③自 1970.1.1 00:00:00 GMT +當前系統的毫秒數=當前時間
public static int getMany(){
Date curDate = new Date();//當前時間
//①獲得當前系統時間的毫秒數,自 1970.1.1 00:00:00 GMT
long time = System.currentTimeMillis();
//②自 1970.1.1 00:00:00 GMT +固定毫秒數=某時間
Date date1 = new Date(Long.valueOf("1503977532450").longValue());
//③自 1970.1.1 00:00:00 GMT +當前系統的毫秒數=當前時間
Date date2 = new Date(time);
System.out.println("curDate = " + curDate.toString());//curDate = Tue Aug 29 11:54:22 CST 2017
System.out.println("millisecond = " + time);//millisecond = 1503978862497
System.out.println("date1 = " + date1.toString());//date1 = Tue Aug 29 11:32:12 CST 2017
System.out.println("date2 = " + date2.toString());//date2 = Tue Aug 29 11:54:22 CST 2017
return (int) time;
}

/**
* Java 日歷類 Calendar 相關方法
* ************************************************************************************************
* ************************************************************************************************
* ************************************************************************************************
* ************************************************************************************************
*/
/**
* 計算指定日期為當年第幾周
* @param year 指定的年份
* @param month 指定的月份
* @param day 指定的日
* @return 指定日期為當年的第幾周
*/
public static int caculateWeekOfYear(int year,int month,int day){
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month - 1);
c.set(Calendar.DATE, day);
return c.get(Calendar.WEEK_OF_YEAR);
}

/**
* 獲取本月第一天是星期幾
* @return
*/
public static int getWeekOfFirstDay(Calendar c){
Calendar calendar = c;
calendar.set(Calendar.DAY_OF_MONTH, 1);//本月第一天set進去
/*
* this field takes values <code>SUNDAY</code>, ---返回1
* <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>, ---返回2,3,4
* <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code> ---返回5,6,7
*/
return calendar.get(Calendar.DAY_OF_WEEK);
}

/**
* 獲取本月1號是該年的第幾周
* @return
*/
public static int getMonthStartWeek(Calendar c){
Calendar calendar = c;
calendar.set(Calendar.DATE, 1);
return calendar.get(Calendar.WEEK_OF_YEAR);
}

/**
* 獲取當天是該年的第幾周
*/
public static int getCurrentWeekOfYear(){
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.WEEK_OF_YEAR);
}

/**
* 獲取上月的總天數
* @return
*/
public static int getLastMonthDays(Calendar c){
Calendar calendar = c;
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}

/**
* 獲取指定月份的總天數
* @return
*/
public static int getCurrentMonthDays(int month){
Calendar c = Calendar.getInstance();
c.set(Calendar.MONTH, month);
return c.getActualMaximum(Calendar.DAY_OF_MONTH);
}

/**
* 獲取指定年份有多少周
* @param year
* @return
*/
public static int getTotalWeekOfYear(int year){
Calendar c = Calendar.getInstance();
return c.getActualMaximum(Calendar.WEEK_OF_YEAR);
}

/**
* 判斷指定月份是否是當前月
* @param month
* @return
*/
public static boolean isCurrentMonth(int month){
Calendar c = Calendar.getInstance();
return (c.get(Calendar.MONTH) == month)?true:false;
}

/**
* 計算指定的月份共有多少天
*/
public static int getTotalDaysOfMonth(int year, int month){
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DATE, 1);
/**
* 計算這個月有多少天
*/
return c.getActualMaximum(Calendar.DAY_OF_MONTH);
}

}

時間處理工具類