package com.xxu.utils;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 日期时间类
*
* <p>对Calendar的封装,以便于使用</p>
*
* @author qsyang
* @version 1.0
*/
public class DateTime implements Serializable {
/**
* yyyy-MM-dd HH:mm:ss 格式
*/
public static final String DEFAULT_DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* yyyy-MM-dd HH:mm 格式
*/
public static final String DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN = "yyyy-MM-dd HH:mm";
/**
* yyyy-MM-dd HH 格式
*/
public static final String DEFAULT_DATE_TIME_HH_FORMAT_PATTERN = "yyyy-MM-dd HH";
/**
* yyyy-MM-dd 格式
*/
public static final String DEFAULT_DATE_FORMAT_PATTERN = "yyyy-MM-dd";
/**
* HH:mm:ss 格式
*/
public static final String DEFAULT_TIME_FORMAT_PATTERN = "HH:mm:ss";
/**
* HH:mm 格式
*/
public static final String DEFAULT_TIME_HHmm_FORMAT_PATTERN = "HH:mm";
/**
* 年
* <p>可以通过DateTime.now().get(DateTime.YEAR_FIELD)来获取当前时间的年</p>
*/
public static final int YEAR_FIELD = java.util.Calendar.YEAR;
/**
* 月
* <p>可以通过DateTime.now().get(DateTime.MONTH_FIELD)来获取当前时间的月</p>
*/
public static final int MONTH_FIELD = java.util.Calendar.MONTH;
/**
* 日
* <p>可以通过DateTime.now().get(DateTime.DAY_FIELD)来获取当前时间的日</p>
*/
public static final int DAY_FIELD = java.util.Calendar.DATE;
/**
* 小时 <p>可以通过DateTime.now().get(DateTime.HOUR_FIELD)来获取当前时间的小时</p>
*/
public static final int HOUR_FIELD = java.util.Calendar.HOUR_OF_DAY;
/**
* 分钟 <p>可以通过DateTime.now().get(DateTime.MINUTE_FIELD)来获取当前时间的分钟</p>
*/
public static final int MINUTE_FIELD = java.util.Calendar.MINUTE;
/**
* 秒
* <p>可以通过DateTime.now().get(DateTime.SECOND_FIELD)来获取当前时间的秒</p>
*/
public static final int SECOND_FIELD = java.util.Calendar.SECOND;
/**
* 毫秒 <p>可以通过DateTime.now().get(DateTime.MILLISECOND_FIELD)来获取当前时间的毫秒</p>
*/
public static final int MILLISECOND_FIELD = java.util.Calendar.MILLISECOND;
private java.util.Calendar c; //日历类
/**
* 获取一个DateTime,此DateTime尚未初始化,表示的时间是1970-1-1 00:00:00.000
* <p>要获取当前系统时间,请用DateTime.now();</p>
*/
public DateTime() {
c = Calendar.getInstance();
c.clear();
}
/**
* 设置时间 <p>可以传入一个时间对象,将会被转换为DateTime类型</p>
*
* @param date 时间对象
*/
public DateTime(java.util.Date date) {
c = Calendar.getInstance();
c.setTime(date);
}
/**
* 设置时间 <p>可以传入一个日历对象,将会被转换为DateTime类型</p>
*
* @param calendar 日历对象
*/
public DateTime(java.util.Calendar calendar) {
this.c = calendar;
}
/**
* 获取当前系统时间
*
* @return DateTime 当前系统时间
*/
public static DateTime now() {
Calendar calendar = Calendar.getInstance();
return new DateTime(calendar);
}
/**
* 用毫秒来设置时间, 时间的基数是1970-1-1 00:00:00.000; <p>比如,new DateTime(1000)
* 则表示1970-1-1 00:00:01.000;<br> 用负数表示基础时间以前的时间</p>
*
* @param milliseconds 毫秒
*/
public DateTime(long milliseconds) {
c = Calendar.getInstance();
c.setTimeInMillis(milliseconds);
}
/**
* 转换为Date类型
*
* @return Date时间
*/
public Date toDate() {
return c.getTime();
}
/**
* 转换成 日历对象
*
* @return Calendar对象
*/
public java.util.Calendar toCalendar() {
return c;
}
/**
* 转换成java.sql.Date(yyyy-MM-dd)日期
*
* @return java.sql.Date日期
*/
public java.sql.Date toSqlDate() {
return new java.sql.Date(c.getTimeInMillis());
}
/**
* 转换为java.sql.Time(hh:mm:ss)时间
*
* @return java.sql.Time时间
*/
public java.sql.Time toSqlTime() {
return new java.sql.Time(c.getTimeInMillis());
}
/**
* 转换为java.sql.Timestamp(时间戳)
*
* @return java.sql.Timestamp时间戳
*/
public java.sql.Timestamp toSqlTimestamp() {
return new java.sql.Timestamp(c.getTimeInMillis());
}
/**
* 解析时间 <p>根据DateTime中的DEFAULT_TIME_FORMAT_PATTERN规则转换为hh:mm:ss或hh:mm格式</p>
*
* @param time 字符串格式时间
* @return DateTime 日期时间对象
*/
public static DateTime parseTime(String time) throws java.text.ParseException {
try {
return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_FORMAT_PATTERN);
} catch (ParseException e) {
return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_HHmm_FORMAT_PATTERN);
}
}
/**
* 解析日期 <p>根据DateTime中的DEFAULT_DATE_FORMAT_PATTERN规则转换为yyyy-MM-dd格式</p>
*
* @param date 字符串格式日期
* @return DateTime 日期时间类
*/
public static DateTime parseDate(String date) throws java.text.ParseException {
return DateTime.parseDateTime(date, DateTime.DEFAULT_DATE_FORMAT_PATTERN);
}
/**
* 解析日期时间 <p>根据DateTime中的DEFAULT_DATE_TIME_FORMAT_PATTERN规则转换为yyyy-MM-dd
* HH:mm:ss格式</p>
*
* @param datetime 字符串格式日期时间
* @return DateTime 日期时间对象
*/
public static DateTime parseDateTime(String datetime) throws java.text.ParseException {
DateTime result = null;
//尝试按yyyy-MM-dd HH:mm:ss分析
try {
result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN);
} catch (ParseException e) {
//解析错误
result = null;
}
//尝试按yyyy-MM-dd HH:mm分析
if (null == result) {
try {
result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN);
} catch (ParseException e) {
//解析错误
result = null;
}
}
//尝试按yyyy-MM-dd HH分析
if (null == result) {
try {
result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HH_FORMAT_PATTERN);
} catch (ParseException e) {
//解析错误
result = null;
}
}
//尝试按yyyy-MM-dd分析
if (null == result) {
try {
result = DateTime.parseDate(datetime);
} catch (ParseException e) {
//解析错误
result = null;
}
}
//尝试按时间分析
if (null == result) {
result = DateTime.parseTime(datetime);
}
return result;
}
/**
* 用指定的pattern分析字符串 <p>pattern的用法参见java.text.SimpleDateFormat</p>
*
* @param datetime 字符串格式日期时间
* @param pattern 日期解析规则
* @return DateTime 日期时间对象
* @see java.text.SimpleDateFormat
*/