package com.wdf.commons.util;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* 日期操作的工具类,主要实现了日期的常用操作
* <p>
* 在工具类中经常使用到工具类格式化的描述,这个主要是一个日期操作类,所以日期的格式
* 主要使用SimpleDateFormat的定义格式
* <p>
* 格式的意义如下:日期时间模式<br>
* 日期时间格式由日期和时间模式字符串指定,在日期时间模式字符串中,未加引号的字母
* 'A'到'Z'和'a'到'z'被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号(')
* 引起来以免进行解释。
* "'"表示单引号所有其他字符均不解释;只是在格式上将他们简单复制到输出字符串,或者在分析时与输入字符串进行匹配。
* @author 王德峰
*@2013-2-26
*@下午08:24:21
*/
public final class DateUtil {
public static final String datePartition = "-";
public static final String defaultDatePattern = "yyyy-MM-dd";
public static final String defaultDateTimePattern = "yyyy-MM-dd HH:mm:ss";
public static final String default_Time_Pattern = "HH:mm:ss";
private DateUtil(){
//因为是工具类,私有构造方法
}
/**
* 获得当前日期的字符串
* 格式yyyy-MM-dd
* @return
*/
public static String nowDateString(){
SimpleDateFormat format = new SimpleDateFormat(defaultDatePattern);
return format.format(new Date());
}
/**
* 获得当前时间的字符串
* 格式yyyy-MM-dd HH:mm:ss
* @return
*/
public static String nowTimeString(){
SimpleDateFormat format = new SimpleDateFormat(defaultDateTimePattern);
return format.format(new Date());
}
/**
* 根据模板返回给定long 型时间的字符串格式
* 模板可以为空
* 为空则返回默认格式的时间串
* @param time
* @param datePattern
* @return
*/
public static String longToString(long time, String datePattern){
SimpleDateFormat format;
if(UtileProving.isEmpty(datePattern)){
format = new SimpleDateFormat(defaultDateTimePattern);
}else{
format = new SimpleDateFormat(datePattern);
}
return format.format(new Date(time));
}
/**
* 返回给定long 型时间的字符串格式
* @param time
* @return
*/
public static String longToString(long time){
return longToString(time);
}
/**
* 获得格林尼治时间
* @param dateTime
* @return
*/
public static String toGmtTimestampString(Date dateTime) {
/**
* DateFormat.getDateTimeInstance()
* 获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格。
* TimeZone表示时区偏移量,也可以计算夏令时
* TimeZone.getTimeZone("GMT")
* 获取给定id的TimeZone
*/
DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(TimeZone.getTimeZone("GMT"));
return df.format(dateTime);
}
/**
* Timestamp
* 一个与 java.util.Date 类有关的瘦包装器 (thin wrapper),
* 它允许 JDBC API 将该类标识为 SQL TIMESTAMP 值。
* 它通过允许小数秒到纳秒级精度的规范来添加保存 SQL TIMESTAMP 小数秒值的能力。
* 也提供支持时间戳值的 JDBC 转义语法的格式化和解析操作的能力。
* @param start
* @param days
* @return
*/
public static Timestamp addDaysToTimestamp(Date start, int days) {
return new Timestamp(start.getTime() + (24 * 60 * 60 * 1000 * days));
}
public static Timestamp addDaysToTimestamp(Date start, Double days) {
return new Timestamp(start.getTime() + ((int) (24 * 60 * 60 * 1000 * days)));
}
/**
* 返回当前时间格式
* 2013-02-26 21:24:29.578
* @return
*/
public static java.sql.Timestamp nowTimestamp() {
return new java.sql.Timestamp(System.currentTimeMillis());
}
/**
* 获得给定时间给定天数后的时间
* @param stamp
* @param daysLater
* @return 给定时间给定天数后的起始时间long型值
*/
public static long getDayStart(Date stamp,int daysLater){
Calendar tempCal = Calendar.getInstance();
tempCal.setTime(stamp);
tempCal.set(tempCal.get(Calendar.YEAR), tempCal.get(Calendar.MONTH), tempCal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
tempCal.add(Calendar.DAY_OF_MONTH, daysLater);
return tempCal.getTime().getTime();
}
/**
* 获得给定时间的开始时间long 型值
* @param stamp
* @return
*/
public static long getDayStart(Date stamp) {
return getDayStart(stamp, 0);
}
/**
*
* @param input
* @param startOfWeek
* @return
*/
public static int weekNumber(Timestamp input, int startOfWeek) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(startOfWeek);
if (startOfWeek == Calendar.MONDAY) {
calendar.setMinimalDaysInFirstWeek(4);
} else if (startOfWeek == Calendar.SUNDAY) {
calendar.setMinimalDaysInFirstWeek(3);
}
calendar.setTime(new java.util.Date(input.getTime()));
return calendar.get(Calendar.WEEK_OF_YEAR);
}
public static int weekNumber(Timestamp input) {
Calendar calendar = Calendar.getInstance();
return weekNumber(input, calendar.getFirstDayOfWeek());
}
/**
* 获得给定时间的下一天的开始时间
* @param stamp
* @return
*/
public static long getNextDayStart(java.sql.Timestamp stamp) {
return getDayStart(stamp, 1);
}
/**
* 获得给定时间给定天数后的结束时间long型值
* @param stamp
* @param daysLater
* @return
*/
public static long getDayEnd(Date stamp, int daysLater) {
Calendar tempCal = Calendar.getInstance();
tempCal.setTime(stamp);
tempCal.set(tempCal.get(Calendar.YEAR), tempCal.get(Calendar.MONTH), tempCal.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
tempCal.add(Calendar.DAY_OF_MONTH, daysLater);
return tempCal.getTime().getTime();
}
/**
* 获得给定时间当天的结束时间long型值
* @param stamp
* @return
*/
public static long getDayEnd(Date stamp) {
return getDayEnd(stamp, 0);
}
public static Date parseDate(String str, String format){
if(format == null){
format = defaultDatePattern;
}
SimpleDateFormat df = new SimpleDateFormat(format);
try {
return df.parse(str);
} catch (Exception e) {
throw new RuntimeException("Could not convert " + str + " to java.util.Date", e);
}
}
/**
* 将日期字符串格式转换成java.util.Date类型
* @param date 日期时间格式为:YYYY-MM-DD HH:MM:SS
* @return
*/
public static java.util.Date toDate(String date){
if(date.indexOf(":") < 0 ){
return parseDate(date, defaultDatePattern);
}else{
int timeColon1 = date.indexOf(":");
int timeColon2 = date.lastIndexOf(":");
if(timeColon1 == timeColon2){
return parseDate(date + "00", defaultDateTimePattern);
}else{
return parseDate(date, defaultDateTimePattern);
}
}
}
/**
* 将日期时间字符串转换成java.util.Date类型
* @param date日期字符串格式:YYYY-MM-DD
* @param time时间字符串格式:HH:MM or HH:MM:SS
* @return
*/
public static java.util.Date toDate(String date, String time){
if(date == null || time == null){
return null;
}
return toDate(date +"" + time);
}
/**
* 将日期、时间的整数转换为java.util.Date类型
* @param month 月份整数
* @param day 日整数
* @param year 年整数
* @param hour 小时整数
* @param minute 分钟整数
* @param second 秒整数
* @return
*/
public static java.util.Date toDate(int month, int day, int year, int hour, int minute, int second){
Calendar calendar = Calendar.getInstance();
try {
calendar.set(year, month - 1, day, hour, minute, second);
calendar.set(Calendar.MILLISECOND, 0);
} catch (Exception e) {
return null;
}
return new java.util.Date(calendar.getTime().getTime());
}
/**
* 将日期时间字符串转换成java.util.Date类型
* @param monthStr 月份字符串
* @param dayStr 日字字符串
* @param yearStr 年字符串
* @param hourStr 小时字符串
* @param minuteStr 分钟字符串
* @param secondStr 秒字符串
* @return
*/
public static java.util.Date toDate(String monthStr, String dayStr, String yearStr, String hourStr, String minuteStr, String secondStr){
int month, day, year, hour, minute, second;
try {
month = Integer.parseInt(monthStr);
day = Integer.parseInt(dayStr);
year = Integer.parseInt(yearStr);
hour = Integer.parseInt(hourStr);
minute = Integer.parseInt(minuteStr);
second = Integer.parseInt(secondStr);
} catch (Exception e) {
return null;
}
return toDate(month, day, year, hour, minute, second);
}
/**
* 将日期字符串转换成java.util.Date类型
* @param date 日期格式的字符串
* @return
*/
public static java.sql.Date toSqlDate(String date){
java.util.Date newDate = toDate(date, "00:00:00");
if(newDate != null){
return new java.sql.Date(newDate.getTime());
}else{
return null;
}
}
/**
* 创建一个日期对象
* @param monthStr月份的字符串
* @param dayStr 日的字符串
* @param yearStr 年的字符串
* @return
*/
public static java.sql.Date toSqlDate(String monthStr, String dayStr, String yearStr){
java.util.Date newDate = toDate(monthStr, dayStr, yearStr, "0", "0", "0");
if(newDate != null){
return new java.sql.Date(newDate.getTime());
}else{
return null;
}
}
/**
* 创建一个日期对象
* @param month 月份数字
* @param day 日数字
* @param year 年数字
* @return
*/
public static java.sql.Date toSqlDate(int month, int day, int year){
java.util.Date newDate = toDate(month, day, year, 0, 0, 0);
if(newDate != null){
return new java.sql.Date(newDate.getTime());
}else{
return null;
}
}
/**
* 将时间格式字符串转换为java.sql.Time类型
* @param time 时间字符串 格式为:HH:MM:SS
* @return
*/
public static java.sql.Time toSqlTime(String time){
java.util.Date newDate = toDate("1970" + datePartition + "1" + datePartition + "1", time);
if(newDate != null){
return new java.sql.Time(newDate.getTime());
}else{
return null;
}
}
/**
* 创建java.sql.Time类型
* @param hourStr 小时字符串
* @param minuteStr 分钟字符串
* @param secondStr 秒字符串
* @return
*/
public static java.sql.Time toSqlTime(String hourStr, String minuteStr, String secondStr){
java.util.Date newDate = toDate("0", "0", "0", hourStr, minuteStr, secondStr);
if(newDate != null){
return new java.sql.Time(newDate.getTime());
}else{
return null;
}
}
/**
* 创建java.sql.Time类型
* @param hourStr 小时的整数
* @param minuteStr 分钟的整数
* @param secondStr 秒的整数
* @return
*/
public static java.sql.Time toSqlTime(int hour, int minute, int second){
java.util.Date newDate = toDate(0, 0, 0, hour, minute, second);
if(newDate != null){
return new java.sql.Time(newDate.getTime());
}else{
return null;
}
}
/**
* 将字符串转换成 java.sql.Timestamp类型
* @param dateTime日期、时间格式的字符串 如:"2013-03-05 21:11:00"
* @return
*/
public static java.sql.Timestamp toTimestamp(String dateTime){
java.util.Date newDate = toDate(dateTime);
if(newDate != null){
return new java.sql.Timestamp(newDate.getTime());
}else{
return null;
}
}
/**
* 将给定的时间日期字符串转换为java.sql.Timestamp类型
* @param date 日期字符串 如"2013-03-05"
* @param time时间字符串如"21:11:00"
* @return
*/
public static java.sql.Timestamp toTimestamp(String date, String time){
if(UtileProving.isEmpty(date) || UtileProving.isEmail(time)){
return null;
}
return toTimestamp(date + " " + time);
}
/**
* 将给定的日期字符串转换成java.sql.Timestamp类型
* @param monthStr 月份字符串
* @param dayStr 日字符串
* @param yearStr 年字符串
* @param hourStr 小时字符串
* @param minuteStr 分钟字符串
* @param secondStr 秒字符串
* @return
*/
public static java.sql.Timestamp toTimestamp(String monthStr, String dayStr, String yearStr, String hourStr, String minuteStr, String secondStr){
java.util.Date newDate = toDate(monthStr, dayStr, yearStr, hourStr, minuteStr, secondStr);
if(newDate != null){
return new java.sql.Timestamp(newDate.getTime());
}else{
return null;
}
}
/**
* 将给定的日期整数转换成java.sql.Timestamp类型
* @param month 月份整数
* @param day 日整数
* @param year 年整数
* @param hour 小时整数
* @param minute 分钟整数
* @param second 秒整数
* @return
*/
public static java.sql.Timestamp toTimestamp(int month, int day, int year, int hour, int minute, int second){
java.util.Date newDate = toDate(month, day, year, hour, minute, second);
if(newDate != null){
return new java.sql.Timestamp(newDate.getTime());
}else{
return null;
}
}
/**
* 将给定日期字符串转换成long值
* @param date
* @return
*/
public static long toLong(String date){
if(date.indexOf(':') < 0){
return parseDate(date, defaultDatePattern).getTime();
}else{
int timeColon1 = date.indexOf(":");
int timeColon2 = date.lastIndexOf(":");
if(timeColon1 == timeColon2){
return parseDate(date + ":00", defaultDateTimePattern).getTime();
}else{
return parseDate(date, defaultDateTimePattern).getTime();
}
}
}
public static DateFormat toTimeFormat(String timeFormat, Locale locale){
DateFormat format = null;
if(timeFormat == null){
format = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
}else{
format = new SimpleDateFormat(timeFormat);
}
return format;
}
/**
* 将java.util.Date类型转换为字符串格式为:YYYY-MM-DD
* @param date
* @return
*/
public static String toDateString(java.util.Date date){
SimpleDateFormat format = new SimpleDateFormat(defaultDatePattern);
return format.format(date);
}
/**
* 将java.util.Date类型转换为字符串格式为:HH:MM:SS
* @param date
* @return
*/
public static String toTimeString(java.util.Date date){
if(date == null){
return "";
}
SimpleDateFormat format = new SimpleDateFormat(default_Time_Pattern);
return format.format(date);
}
/**
* 将时间的整数转换成标准格式的字符串格式:HH:MM:SS
* @param hour 小时整数
* @param minute 分钟整数
* @param second 秒整数
* @return
*/
public static String toTimeString(int hour, int minute, int second){
String hourStr;
String minuteStr;
String secondStr;
if(hour < 10){
hourStr = "0" + hour;
}else{
hourStr = "" + hour;
}
if(minute < 10){
minuteStr = "0" + minute;
}else{
minuteStr = "" + minute;
}
if(second < 10){
secondStr = "0" + second;
}else{
secondStr = "" + second;
}
if(second == 0){
return hourStr + ":" + minuteStr;
}else{
return hourStr + ":" + minuteStr + ":" + secondStr;
}
}
/**
* 将java.util.Date中的时间取出来,转换为DateTime格式的字符串格式:YYYY-MM-DD HH:MM:SS
* @param date
* @param datePattern
* @return
*/
public static String toDateTimeString(java.util.Date date, String datePattern){
if(date == null){
return "";
}
SimpleDateFormat format;
if(UtileProving.isEmail(datePattern)){
format = new SimpleDateFormat(defaultDateTimePattern);
}else{
format = new SimpleDateFormat(datePattern);
}
return format.format(date);
}
public static String toDateTimeString(java.util.Date date){
return toDateTimeString(date, null);
}
public static String toDateTimeString(java.sql.Date date){
return toDateTimeString(date, null);
}
/**
* 得到当前月的开始那天
* @return
*/
public static java.sql.Timestamp monthBegin(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.AM_PM, Calendar.AM);
return new Timestamp(calendar.getTime().getTime());
}
/**
* 在日期格式的字符串中获得月字符串
* @param date 日期格式字符串,格式:YYYY-MM-DD
* @return
*/
public static String getMonth(String date){
if(UtileProving.isEmail(date)){
return "";
}
int dateStr1 = date.indexOf(DateUtil.datePartition);
int dateStr2 = date.lastIndexOf(DateUtil.datePartition);
return date.substring(dateStr1 + 1, dateStr2);
}
public static String getMonth(java.sql.Date date) {
String str = toDateTimeString(date);
return getMonth(str);
}
public static String getMonth(java.util.Date date) {
String str = toDateTimeString(date);
return getMonth(str);
}
/**
* 在日期格式字符串中获得年字符串
* @param date日期字符串,格式:YYYY-MM-DD
* @return
*/
public static String getYear(String date){
if(UtileProving.isEmail(date)){
return "";
}
int dateStr = date.indexOf(DateUtil.datePartition);
return date.substring(0,dateStr);
}
public static String getYear(java.sql.Date date){
String str = toDateTimeString(date);
return getYear(str);
}
public static String getYear(java.util.Date date) {
String str = toDateTimeString(date);
return getYear(str);
}
/**
* 在日期格式字符串中获得日字符串
* @param date 日期字符串,格式:YYYY-MM-DD
* @return
*/
public static String getDay(String date){
if(UtileProving.isEmail(date)){
return "";
}
int dateStr = date.lastIndexOf(DateUtil.datePartition);
int dateStr1 = (date.length() < (dateStr +3)) ? date.length() : dateStr + 3;
return date.substring(dateStr + 1, dateStr1);
}
public static String getDay(java.sql.Date date) {
String str = toDateTimeString(date);
return getDay(str);
}
public static String getDay(java.util.Date date) {
String str = toDateTimeString(date);
return getDay(str);
}
/**
* 在时间格式字符串中获得小时字符串
* @param date 时间格式字符串,格式:YYYY-MM-DD HH:MM:SS
* @return
*/
public static String getHour(String date){
if(UtileProving.isEmail(date)){
return "";
}
int dateSlash = date.indexOf(":");
int start = (dateSlash -2) < 0 ? dateSlash : dateSlash - 2;
return date.substring(start, dateSlash).trim();
}
public static String getHour(java.sql.Date date) {
String str = toDateTimeString(date);
return getHour(str);
}
public static String getHour(java.util.Date date) {
String str = toDateTimeString(date);
return getHour(str);
}
/**
* 在时间格式字符串中获得分钟字符串
*
* @param date日期格式的字符串,格式:YYYY-MM-DD HH:MM:SS
* @return
*/
public static String getMinute(String date) {
if (UtileProving.isEmpty(date))
return "";
int dateSlash1 = date.indexOf(":");
int dateSlash2 = date.lastIndexOf(":");
if (dateSlash1 == dateSlash2)
return date.substring(dateSlash1 + 1, (date.length() < (dateSlash2 + 3)) ? date.length() : (dateSlash2 + 3)).trim();
return date.substring(dateSlash1 + 1, dateSlash2).trim();
}
public static String getMinute(java.sql.Date date) {
String str = toDateTimeString(date);
return getMinute(str);
}
public static String getMinute(java.util.Date date) {
String str = toDateTimeString(date);
return getMinute(str);
}
/**
* 在时间格式字符串中获得秒字符串
* @param date日期格式的字符串,格式:YYYY-MM-DD HH:MM:SS
* @return
*/
public static String getSecond(String date) {
if (UtileProving.isEmpty(date))
return "";
int dateSlash1 = date.indexOf(":");
int dateSlash2 = date.lastIndexOf(":");
if (dateSlash1 == dateSlash2)
return "0";
return date.substring(dateSlash2 + 1, (date.length() < (dateSlash2 + 3)) ? date.length() : (dateSlash2 + 3)).trim();
}
public static String getSecond(java.sql.Date date) {
String str = toDateTimeString(date);
return getSecond(str);
}
public static String getSecond(java.util.Date date) {
String str = toDateTimeString(date);
return getSecond(str);
}
/**
* 获得星期1-7
* @param date
* @return 字符串1,2,3,4,5,6,7
*/
public static String getWeek(java.util.Date date){
if(date == null){
return "";
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
if(week == 0){
week = 7;
}
return String.valueOf(week);
}
/**
* 获得星期1-7
* @param date
* @return 字符串1,2,3,4,5,6,7
*/
public static String getWeek(java.sql.Date date){
if(date == null){
return "";
}
return getWeek(new java.util.Date(date.getTime()));
}
/**
* 获得星期1-7
* @param date date 格式的字符串如:2013-03-06
* @return
*/
public static String getWeek(String date){
return getWeek(toSqlDate(date));
}
/**
* 获得当前星期1-7
* @return
*/
public static String getWeek(){
Calendar calendar = Calendar.getInstance();
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
if(week == 0){
week = 7;
}
return String.valueOf(week);
}
public static java.sql.Timestamp getTimestamp(long time){
return new java.sql.Timestamp(time);
}
/**
* 将long格式时间转换为时间格式字符串
* @param time
* @return
*/
public static String getTimeStr(long time){
return longToString(time);
}
/**
* 处理格式为 Fri, 03 Apr 2009 02:28:31 GMT 的时间,注意如果GMT后有+{1}8:00 必须是标准的
* @param gmt
* @return
*/
public static Date gmtStrToDate(String gmt){
SimpleDateFormat defaultDf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US);
try {
return defaultDf.parse(gmt);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// public static void main(String[] args) {
// System.out.println(getDatStart(new Date(), 0));
// }
}