package com.resoft.framework.common.util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.apache.log4j.Logger;
/**
* 时间工具类,保存各种时间工具方法
*
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public class DateUtils {
private static Logger logger = Logger.getLogger(DateUtils.class);
public static final String DATE_FORMAT = "MM/dd/yyyy";
public static final String DATE_TIME_FORMAT = "MM/dd/yyyy HH:mm";
public static final String ORA_DATE_FORMAT = "yyyyMMdd";
public static final String ORA_DATE_TIME_FORMAT = "yyyyMMddHHmm";
public static final String ORA_DATE_TIMES_FORMAT = "yyyy-MM-dd HH:mm:ss,SSS";
public static final String ORA_DATES_FORMAT = "yyyy-MM-dd";
private static final int dayArray[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31 };
private DateUtils() {
}
/**
* 类型转换日期
*
* @param dateString
* 日期格式
* @param partten
* 格式模板(如:yyyy-MM-dd)
* @author hexin@resoft.css.com.cn
* @return StringToDate 类型转换后的日期
* @since Jun 13, 2008
*/
public synchronized static Date StringToDate(String dateString,
String partten) {
SimpleDateFormat df = new SimpleDateFormat(partten);
Date date = null;
try {
date = df.parse(dateString);
} catch (Exception e) {
logger.error("DateUtils.StringToDate error!");
e.printStackTrace();
}
return date;
}
/**
* 日期类型转换成字符型
*
* @param date
* Date类型的给定日期
* @param partten
* 格式模板(如:yyyy-MM-dd)
* @return 类型转换后的字符型日期
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static String toString(Date date, String partten) {
if (date == null) {
return "";
} else {
SimpleDateFormat df = new SimpleDateFormat(partten);
return df.format(date);
}
}
/**
* 给定字符串日期按模板转换成Calendar类型
*
* @param dateString
* 字符串形式的给定日期
* @param partten
* 格式模板(如:yyyy-MM-dd)
* @return 类型转换后的Calendar对象
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static Calendar parseCalendarFormat(String dateString,
String pattern) {
SimpleDateFormat simpledateformat = new SimpleDateFormat(pattern);
Calendar cal = null;
simpledateformat.applyPattern(pattern);
try {
simpledateformat.parse(dateString);
cal = simpledateformat.getCalendar();
} catch (Exception e) {
logger.error("DateUtils.parseCalendarFormat error!");
e.printStackTrace();
}
return cal;
}
/**
* Calendar类型转换成字符型
*
* @param cal
* Calendar日期类型
* @param partten
* 格式模板(如:yyyy-MM-dd)
* @return 类型转换后的字符型日期
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static String getDateMilliFormat(Calendar cal,
String pattern) {
return toString(cal.getTime(), pattern);
}
/**
* 取得Calendar实例
*
* @return Calendar类型实例
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static Calendar getCalendar() {
return GregorianCalendar.getInstance();
}
/**
* 取得当前年的某一个月的最后一天
*
* @param month
* 数字类型的月份值
* @return 参数月份的最后一天
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static int getLastDayOfMonth(int month) {
if (month < 1 || month > 12) {
return -1;
}
int retn = 0;
if (month == 2) {
if (isLeapYear()) {
retn = 29;
} else {
retn = dayArray[month - 1];
}
} else {
retn = dayArray[month - 1];
}
return retn;
}
/**
* 取得当某年的某一个月的最后一天
*
* @param year
* 数字类型的年份值
* @param month
* 数字类型的月份值
* @return 参数月份的最后一天
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static int getLastDayOfMonth(int year, int month) {
if (month < 1 || month > 12) {
return -1;
}
int retn = 0;
if (month == 2) {
if (isLeapYear(year)) {
retn = 29;
} else {
retn = dayArray[month - 1];
}
} else {
retn = dayArray[month - 1];
}
return retn;
}
/**
* 取得某日期所在月的最后一天
*
* @param date
* Date类型的某日期
* @return 最后一天的日期型结果
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static Date getLastDayOfMonth(Date date) {
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
switch (gc.get(2)) {
case 0: // '\0'
gc.set(5, 31);
break;
case 1: // '\001'
gc.set(5, 28);
break;
case 2: // '\002'
gc.set(5, 31);
break;
case 3: // '\003'
gc.set(5, 30);
break;
case 4: // '\004'
gc.set(5, 31);
break;
case 5: // '\005'
gc.set(5, 30);
break;
case 6: // '\006'
gc.set(5, 31);
break;
case 7: // '\007'
gc.set(5, 31);
break;
case 8: // '\b'
gc.set(5, 30);
break;
case 9: // '\t'
gc.set(5, 31);
break;
case 10: // '\n'
gc.set(5, 30);
break;
case 11: // '\013'
gc.set(5, 31);
break;
}
if (gc.get(2) == 1 && isLeapYear(gc.get(1))) {
gc.set(5, 29);
}
return gc.getTime();
}
/**
* 取得某日期所在月的最后一天
*
* @param date
* Calendar类型的某日期
* @return 最后一天的日期型结果
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static Calendar getLastDayOfMonth(Calendar gc) {
switch (gc.get(2)) {
case 0: // '\0'
gc.set(5, 31);
break;
case 1: // '\001'
gc.set(5, 28);
break;
case 2: // '\002'
gc.set(5, 31);
break;
case 3: // '\003'
gc.set(5, 30);
break;
case 4: // '\004'
gc.set(5, 31);
break;
case 5: // '\005'
gc.set(5, 30);
break;
case 6: // '\006'
gc.set(5, 31);
break;
case 7: // '\007'
gc.set(5, 31);
break;
case 8: // '\b'
gc.set(5, 30);
break;
case 9: // '\t'
gc.set(5, 31);
break;
case 10: // '\n'
gc.set(5, 30);
break;
case 11: // '\013'
gc.set(5, 31);
break;
}
if (gc.get(2) == 1 && isLeapYear(gc.get(1))) {
gc.set(5, 29);
}
return gc;
}
/**
* 取得某日期所在周的最后一天
*
* @param date
* Date类型日期参数
* @return 所在周的最后一天日期
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static Date getLastDayOfWeek(Date date) {
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
switch (gc.get(7)) {
case 1: // '\001'
gc.add(5, 6);
break;
case 2: // '\002'
gc.add(5, 5);
break;
case 3: // '\003'
gc.add(5, 4);
break;
case 4: // '\004'
gc.add(5, 3);
break;
case 5: // '\005'
gc.add(5, 2);
break;
case 6: // '\006'
gc.add(5, 1);
break;
case 7: // '\007'
gc.add(5, 0);
break;
}
return gc.getTime();
}
/**
* 取得某日期所在周的第一天
*
* @param date
* Date类型日期参数
* @return 当周的第一天日期
* @author hexin@resoft.css.com.cn
* @since Jun 13, 2008
*/
public synchronized static Date getFirstDayOfWeek(Date date) {