import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.http.impl.cookie.DateUtils;
public class DateTest {
private final static String CHINESE_DATE_FORMAT = "yyyy年 MM月 dd日";
private final static String CHINESE_TIME_FORMAT = "HH时 mm分 ss秒";
private final static String CHINESE_DATETIME_FORMAT = "yyyy年 MM月 dd日,HH时 mm分 ss秒";
private final static String CHINESE_DATETIME_MILLIS_FORMAT = "yyyy年 MM月 dd日,HH时 mm分 ss秒.SSS";
private final static String COMMON_DATE_FORMAT = "yyyyMMdd";
private final static String COMMON_TIME_FORMAT = "HH:mm:ss";
private final static String COMMON_DATETIME_FORMAT = "yyyyMMdd HH:mm:ss";
private final static String COMMON_DATETIME_MILLIS_FORMAT = "yyyyMMdd HH:mm:ss.SSS";
private final static String DASH_DATE_FORMAT = "yyyy-MM-dd";
private final static String DASH_TIME_FORMAT = "HH:mm:ss";
private final static String DASH_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
private final static String DASH_DATETIME_MILLIS_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
private final static String SLASH_DATE_FORMAT = "yyyy/MM/dd";
private final static String SLASH_TIME_FORMAT = "HH:mm:ss";
private final static String SLASH_DATETIME_FORMAT = "yyyy/MM/dd HH:mm:ss";
private final static String SLASH_DATETIME_MILLIS_FORMAT = "yyyy/MM/dd HH:mm:ss.SSS";
public static Date parse(String dateStr, String pattern){
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.setLenient(false);
try {
date = sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static String format(Date date, String pattern){
String dateStr = null;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setLenient(false);
dateStr = sdf.format(date);
return dateStr;
}
/**
* 获取两个时间之间相差的秒数
*
* @param begin 开始时间
* @param end 结束时间
*
* @return Date 返回新的时间
*/
public static int getIntevalsBySecond(Date begin , Date end){
return getIntevalsOfDates(Calendar.SECOND, begin, end);
}
/**
* 获取两个时间之间相差的分钟数
*
* @param begin 开始时间
* @param end 结束时间
*
* @return Date 返回新的时间
*/
public static int getIntevalsByMinute(Date begin , Date end){
return getIntevalsOfDates(Calendar.MINUTE, begin, end);
}
/**
* 获取两个时间之间相差的小时数
*
* @param begin 开始时间
* @param end 结束时间
*
* @return Date 返回新的时间
*/
public static int getIntevalsByHour(Date begin , Date end){
return getIntevalsOfDates(Calendar.HOUR, begin, end);
}
/**
* 获取两个时间之间相差的天数
*
* @param begin 开始时间
* @param end 结束时间
*
* @return Date 返回新的时间
*/
public static int getIntevalsByDay(Date begin , Date end){
return getIntevalsOfDates(Calendar.DATE, begin, end);
}
/**
* 获取两个时间之间相差的月数
*
* @param begin 开始时间
* @param end 结束时间
*
* @return Date 返回新的时间
*/
public static int getIntevalsByMonth(Date begin , Date end){
return getIntevalsOfDates(Calendar.MONTH, begin, end);
}
/**
* 获取两个时间之间相差的年数
*
* @param begin 开始时间
* @param end 结束时间
*
* @return Date 返回新的时间
*/
public static int getIntevalsByYear(Date begin , Date end){
return getIntevalsOfDates(Calendar.YEAR, begin, end);
}
/**
* 为一个时间增加指定的分钟数,当增加后的小时数超过最大值或小于最小值则滚动上级;
* 采用24小时表示方式
* @param date 要修改的时间
* @param months 要增加的分钟数,负数则是减去指定的分钟数
*
* @return Date 返回新的时间
*/
public static Date addSeconds(Date date , int seconds){
return add(date, Calendar.SECOND, seconds);
}
/**
* 为一个时间增加指定的分钟数,当增加后的天数超过最大值或小于最小值则滚动上级;
*
* @param date 要修改的时间
* @param months 要增加的分钟数,负数则是减去指定的分钟数
*
* @return Date 返回新的时间
*/
public static Date rollSeconds(Date date , int seconds){
return add(date, Calendar.SECOND, seconds);
}
/**
* 为一个时间增加指定的分钟数,当增加后的小时数超过最大值或小于最小值则滚动上级;
* 采用24小时表示方式
* @param date 要修改的时间
* @param months 要增加的分钟数,负数则是减去指定的分钟数
*
* @return Date 返回新的时间
*/
public static Date addMinutes(Date date , int minutes){
return add(date, Calendar.MINUTE, minutes);
}
/**
* 为一个时间增加指定的分钟数,当增加后的天数超过最大值或小于最小值则滚动上级;
*
* @param date 要修改的时间
* @param months 要增加的分钟数,负数则是减去指定的分钟数
*
* @return Date 返回新的时间
*/
public static Date rollMinutes(Date date , int minutes){
return add(date, Calendar.MINUTE, minutes);
}
/**
* 为一个时间增加指定的小时数,当增加后的小时数超过最大值或小于最小值则滚动上级;
*
* @param date 要修改的时间
* @param months 要增加的分钟数,负数则是减去指定的分钟数
*
* @return Date 返回新的时间
*/
public static Date addHours(Date date , int hours){
return add(date, Calendar.DAY_OF_MONTH, hours);
}
/**
* 为一个时间增加指定的月数,当增加后的天数超过最大值或小于最小值则滚动上级;
* 采用24小时表示方式
* @param date 要修改的时间
* @param months 要增加的小时数,负数则是减去指定的小时数
*
* @return Date 返回新的时间
*/
public static Date rollHours(Date date , int hours){
return add(date, Calendar.HOUR_OF_DAY, hours);
}
/**
* 为一个时间增加指定的月数,当增加后的天数超过最大值或小于最小值则滚动年月;
*
* @param date 要修改的时间
* @param months 要增加的天数,负数则是减去指定的天数
*
* @return Date 返回新的时间
*/
public static Date addDays(Date date , int days){
return add(date, Calendar.DAY_OF_MONTH, days);
}
/**
* 为一个时间增加指定的月数,仅仅滚动月,
*
* @param date 要修改的时间
* @param months 要增加的天数,负数则是减去指定的天数
*
* @return Date 返回新的时间
*/
public static Date rollDays(Date date , int days){
return roll(date, Calendar.DAY_OF_MONTH, days);
}
/**
* 为一个时间增加指定的月数,当增加后的月数超过最大月或小于最小月则滚动年;
* @param date 要修改的时间
* @param months 要增加的月数,负数则是减去指定的月数
* @return Date 返回新的时间
*/
public static Date addMonths(Date date , int months){
return add(date, Calendar.MONTH, months);
}
/**
* 为一个时间增加指定的月数,仅仅滚动月,
*
* @param date 要修改的时间
* @param months 要增加的月数,负数则是减去指定的月数
*
* @return Date 返回新的时间
*/
public static Date rollMonths(Date date , int months){
return roll(date, Calendar.MONTH, months);
}
/**
* 增加或减去日期中指定单位上的时间,同时会滚动更大单位上的时间
*
* @param date 要修改的时间
* @param field @see Calender
* @param units 单位数
*
* @return Date 返回新的时间
*/
protected static Date add(Date date, int field, int units){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(field, units);
return calendar.getTime();
}
/**
* 增加或减去日期中指定单位上的时间,但不修改更大单位上的时间,仅仅滚动本单位上的时间
*
* @param date 要修改的时间
* @param field @see Calender
* @param units 单位数
*
* @return Date 返回新的时间
*/
protected static Date roll(Date date, int field, int units){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.roll(field, units);
return calendar.getTime();
}
protected static int getIntevalsOfDates(int field, Date begin, Date end){
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(begin);
calendar2.setTime(end);
long intervals = calendar1.getTimeInMillis() - calendar2.getTimeInMillis();
int ret = 0;
switch (field) {
case Calendar.YEAR:
{
int beginYear = calendar1.get(Calendar.YEAR);
int endYear = calendar2.get(Calendar.YEAR);
ret = endYear - beginYear;
}
break;
case Calendar.MONTH:
{
int beginYear = calendar1.get(Calendar.YEAR);
int endYear = calendar2.get(Calendar.YEAR);
int beginMonth = calendar1.get(Calendar.MONTH);
int endMonth = calendar2.get(Calendar.MONTH);
if (begin.before(end)) {
ret = (endYear - beginYear)*12 -beginMonth + endMonth;
}else{
ret = -((beginYear - endYear)*12 - endMonth + beginMonth);
}
}
break;
case Calendar.DATE:
{
ret = (int) (intervals / (1000*60*60*24));
}
break;
case Calendar.HOUR:
{
ret = (int) (intervals / (1000*60*60));
}
break;
case Calendar.MINUTE:
{
ret = (int) (intervals / (1000*60));
}
break;
case Calendar.SECOND:
{
ret = (int) (intervals / (1000));
}
break;
default:
break;
}
return ret;
}
/**
* @param date 要获取月中最后一天的日期
* @return int 月中的最后一天,1表示一月中的第一天;
*/
public static int getLastDayOfMonth(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
return calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* @param month 要获取最后一天的本年的月,1表示首月
* @return int 月中的最后一天,1表示一月中的第一天;
*
*
*/
public static int getLastDayOfMonth(int month){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, month - 1);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);
return calendar.get(Calendar.DAY_OF_MONTH);
}
public static void main(String[] args) {
Date date1 = new Date();
Date date2 = new Date(System.currentTimeMillis());
System.out.println("get last day of Feb:"+getLastDayOfMonth(12));
Date date3 = addMonths(date1, 23);
System.err.println("get interval years : date1:"+date1+",date3:"+date3+":"
+getIntevalsOfDates(Calendar.YEAR, date1, date3));
System.err.println("get interval years : date1:"+date1+",date3:"+date3+":"
+getIntevalsOfDates(Calendar.MONTH, date1, date3));
Timestamp timestamp = new Timestamp(date1.getTime());
System.out.println(format(date1, COMMON_DATETIME_MILLIS_FORMAT));
System.out.println(format(date1, CHINESE_DATE_FORMAT));
}
public static void useCalenderMain(){
Calendar calendar = Calendar.getInstance();
Date date1 = new Date();
Date date2 = new Date(System.currentTimeMillis());
System.out.println(date1.after(date2));
System.out.println(date1.getDate());
System.out.println(date1.getDay());
System.out.println(date1.getHours());
System.out.println(date1.getMinutes());
System.out.println(calendar.getTime());
System.out.println(calendar.getAvailableLocales());
System.out.println(calendar.getTimeZone());
System.out.println(calendar.getTimeInMillis());
System.out.println("calendar.get(Calendar.YEAR):"+calendar.get(Calendar.YEAR));
System.out.println("calendar.get(Calendar.MONTH):"+calendar.get(Calendar.MONTH));
System.out.println("calendar.get(Calendar.DATE):"+calendar.get(Calendar.DATE));
System.out.println("calendar.get(Calendar.DAY_OF_YEAR):"+calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("calendar.get(Calendar.DAY_OF_MONTH):"+calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("calendar.get(Calendar.DAY_OF_WEEK):"+calendar.get(Calendar.DAY_OF_WEEK));//周日为第一天
System.out.println("calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH):"+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("calendar.get(Calendar.HOUR):"+calendar.get(Calendar.HOUR));
System.out.println("calendar.get(Calendar.HOUR_OF_DAY):"+calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("calendar.get(Calendar.MINUTE):"+calendar.get(Calendar.MINUTE));
System.out.println("calendar.get(Calendar.SECOND):"+calendar.get(Calendar.SECOND));
System.out.println("calendar.get(Calendar.MILLISECOND):"+calendar.get(Calendar.MILLISECOND));
calendar.add(Calendar.DAY_OF_MONTH, -30);
date2 = calendar.getTime();
System.out.println("calendar.add(Calendar.DAY_OF_MONTH, -30):"+date2);
calendar.add(Calendar.DAY_OF_MONTH, 30);
date2 = calendar.getTime();
System.out.println("calendar.add(Calendar.DAY_OF_MONTH, 30):"+date2);
calendar.roll(Calendar.DAY_OF_MONTH, 30);
date2 = calendar.getTime();
System.out.println("calendar.roll(Calendar.DAY_OF_MONTH, -30):"+date2);
}
}