package com.zxt.basic.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 时间日期操作类 <br/>
* @author ZHENG YI <br/>
*/
public class DateUtil {
/** 日期格式 */
public static final String FORMAT_DATE = "yyyy-MM-dd";
/** 日期时间格式 */
public static final String FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss";
/** 时间格式 */
public static final String FORMAT_TIME = "HH:mm:ss";
/** 整点时间格式 */
public static final String FORMAT_DATETIMEZD = "yyyy-MM-dd HH:00:00";
/** 日期格式(年, 月) */
public static final String FORMAT_YEARMONTH = "yyyy-MM";
/** 全时间格式 */
public static final String FORMAT_FULLTIME = "yyyyMMddHHmmssSSS";
/**
* 根据规定格式的字符串得到Calendar
* @param dateString 日期串
* @return 对应Calendar
*/
public static Calendar getCalendar (String dateString) {
Calendar calendar = Calendar.getInstance();
String[] items = dateString.split("-");
calendar.set(Integer.parseInt(items[0]), Integer.parseInt(items[1]) - 1, Integer.parseInt(items[2]));
return calendar;
}
/**
* 根据指定的日期格式将时间日期字符串转化为Date对象
* @param dateString 时间或日期字符串
* @param format 格式
* @return Date
*/
public static java.util.Date getDateFromString (String dateString, String format) {
SimpleDateFormat sdf = new SimpleDateFormat (format);
try {
return sdf.parse(dateString);
} catch (ParseException e) {
return null;
}
}
/**
* 将Date对象根据指定的时间格式转换为String字符串
* @param date Date
* @param format 格式
* @return String
*/
public static String getStringFromDate (java.util.Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
public static void main(String[] args) {
}
/**
* 转换时间字符串的格式
* @param dateString 时间字符串
* @param fromFormat 当前格式
* @param toFormat 转换格式
* @return String
*/
public static String changeFormat (String dateString, String fromFormat, String toFormat) {
java.util.Date date = getDateFromString(dateString, fromFormat);
if (date == null)
return dateString;
return getStringFromDate (date, toFormat);
}
/**
* 取得当前日期时间的字符串表示形式
* @return String
*/
public static String getDateTime () {
Calendar calendar = Calendar.getInstance();
return getStringFromDate(calendar.getTime(), FORMAT_DATETIME);
}
/**
* 取得当前日期的字符串表现形式
* @return String
*/
public static String getDate () {
Calendar calendar = Calendar.getInstance();
return getStringFromDate(calendar.getTime(), FORMAT_DATE);
}
/**
* 取得当前时间的字符串表示形式
* @return String
*/
public static String getTime () {
Calendar calendar = Calendar.getInstance();
return getStringFromDate(calendar.getTime(), FORMAT_TIME);
}
/**
* 取得当前年的年份
* @return int
*/
public static int getYear () {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.YEAR);
}
/**
* 取得当前月的月份
* @return int
*/
public static int getMonth () {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.MONTH);
}
/**
* 取得当前日的日期
* @return int
*/
public static int getDay () {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DATE);
}
/**
* 取得指定的日期字符串的星期数
* @param date 日期字符串
* @return String
*/
public static String getChineseDayOfWeek (String date) {
Calendar calendar = getCalendar(date);
int w = calendar.get(Calendar.DAY_OF_WEEK);
String week = "";
switch (w) {
case Calendar.SUNDAY:
week = "星期日";
break;
case Calendar.MONDAY:
week = "星期一";
break;
case Calendar.TUESDAY:
week = "星期二";
break;
case Calendar.WEDNESDAY:
week = "星期三";
break;
case Calendar.THURSDAY:
week = "星期四";
break;
case Calendar.FRIDAY:
week = "星期五";
break;
case Calendar.SATURDAY:
week = "星期六";
break;
default:
week = "星期一";
break;
}
return week;
}
/**
* 取得当前日期是星期几
* @return String
*/
public static String getDayOfWeek () {
return getChineseDayOfWeek (getDate ());
}
/**
* 取得中文的数据字符串
* @param number 数字
* @return String
*/
public static String getChineseNumber (int number) {
String n = "";
switch (number) {
case 0:
n = "O";
break;
case 1:
n = "一";
break;
case 2:
n = "二";
break;
case 3:
n = "三";
break;
case 4:
n = "四";
break;
case 5:
n = "五";
break;
case 6:
n = "六";
break;
case 7:
n = "七";
break;
case 8:
n = "八";
break;
case 9:
n = "九";
break;
default:
n = "";
break;
}
return n;
}
/**
* 根据日期值得到中文日期字符串
* @param date 日期值
* @return 中文日期字符串
*/
public static String getChineseDate(String date) {
if (date.length() < 10) {
return "";
} else {
String year = date.substring(0, 4);
String month = date.substring(5, 7);
String day = date.substring(8, 10);
String y1 = year.substring(0, 1);
String y2 = year.substring(1, 2);
String y3 = year.substring(2, 3);
String y4 = year.substring(3, 4);
String m2 = month.substring(1, 2);
String d1 = day.substring(0, 1);
String d2 = day.substring(1, 2);
String cy1 = getChineseNumber(Integer.parseInt(y1));
String cy2 = getChineseNumber(Integer.parseInt(y2));
String cy3 = getChineseNumber(Integer.parseInt(y3));
String cy4 = getChineseNumber(Integer.parseInt(y4));
String cm2 = getChineseNumber(Integer.parseInt(m2));
String cd1 = getChineseNumber(Integer.parseInt(d1));
String cd2 = getChineseNumber(Integer.parseInt(d2));
String cYear = cy1 + cy2 + cy3 + cy4 + "年";
String cMonth = "月";
if (Integer.parseInt(month) > 9) {
cMonth = "十" + cm2 + cMonth;
} else {
cMonth = cm2 + cMonth;
}
String cDay = "日";
if (Integer.parseInt(day) > 9) {
cDay = cd1 + "十" + cd2 + cDay;
} else {
cDay = cd2 + cDay;
}
String chineseday = cYear + cMonth + cDay;
return chineseday;
}
}
/**
* 根据日期值得到中文日期字符串
* 返回2005年09月23日格式的日期
* @param date 给定日期
* @return String
*/
public static String getChineseTwoDate(String date) {
if (date.length() < 10) {
return "";
} else {
String year = date.substring(0, 4);
String month = date.substring(5, 7);
String day = date.substring(8, 10);
return year + "年" + month + "月" + day + "日";
}
}
/**
* 根据当天的日期值得到中文日期字符串
* 返回2005年09月23日格式的日期
* @return String
*/
public static String getChineseTwoDate() {
return getChineseTwoDate(getDate());
}
/**
* 得到与指定日期相差指定天数的日期字符串
* @param dateString 指定的日期
* @param period 前后的天数,正值为后, 负值为前
* @param periodType 周期类别 可以是天、月、年
* @return 日期字符串
*/
public static String getCertainDate (String date, int period, int periodType) {
Calendar calendar = getCalendar(date);
switch (periodType) {
case Calendar.DATE:
calendar.add(Calendar.DATE, period);
break;
case Calendar.MONTH:
calendar.add(Calendar.MONTH, period);
break;
case Calendar.YEAR:
calendar.add(Calendar.YEAR, period);
break;
default:
break;
}
return getStringFromDate(calendar.getTime(), FORMAT_DATE);
}
/**
* 得到与指定日期相差指定天数的日期字符串
* @param dateString 指定的日期
* @param days 前后的天数,正值为后, 负值为前
* @return 日期字符串
*/
public static String getCertainDate(String dateString, int days) {
Calendar calendar = getCalendar(dateString);
calendar.add(Calendar.DATE, days);
return getStringFromDate(calendar.getTime(), FORMAT_DATE);
}
/**
* 得到指定日期的星期一的日期
* @param dateString 日期字符串
* @return 本周星期一的日期
*/
public static String getFirstDateOfWeek(String dateString) {
Calendar calendar = getCalendar(dateString);
int iCount;
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
iCount = -6;
} else {
iCount = Calendar.MONDAY - calendar.get(Calendar.DAY_OF_WEEK);
}
return getCertainDate(dateString, iCount);
}
/**
* 返回两个时间相差的小时数
* @param beginTime 开始时间
* @param endTime 结束时间
* @return 返回值
*/
public static double getDiffHoure(String beginTime, String endTime) {
double dif = 0;
try {
java.util.Date eDatetime = getDateFromString(endTime, FORMAT_DATE);
java.util.Date bDatetime = getDateFromString(beginTime, FORMAT_DATE);
dif = (eDatetime.getTime() - bDatetime.getTime()) / 1000 / 3600;
} catch (Exception e) {
dif = 0;
}
return dif;
}
/**
* 得到当前日期的所在月的第一天的日期
* @param date 当前日期
* @return String 返回的日期
*/
public static String getMonthFirstDay(String date) {
Calendar cal = getCalendar(date);
String month = String.valueOf(cal.get(Calendar.MONTH) + 1);
String year = String.valueOf(cal.get(Calendar.YEAR));
if (Integer.parseInt(month) < 10) {
month = "0" + month;
}
return year + "-" + month + "-01";
}
/**
* 得到当前日期的所在月的最后一天的日期
* @param date 当前日期
* @return String 返回的日期
*/
public static String getMonthLastDay(String date) {
Calendar cal = getCalendar(date);
int month = cal.get(Calendar.MONTH) + 1;
int year = cal.get(Calendar.YEAR);
int nextMonth = month + 1;
int nextYear = year;
if (nextMonth == 13) {
nextMonth = 1;
nextYear = nextYear + 1;
}
String nextMonthFirstDay = nextYear + "-" + nextMonth + "-01";
return getCertainDate(nextMonthFirstDay, -1);
}
/**
* 取得两日期间的月份差数
* @param startDate 起始日期
* @param endDate 结束日期
* @return 月份差数
*/
public static int getMonthDiff(String startDate, String endDate) {
String[] startArray = startDate.split("-");
String[] endArray = endDate.split("-");
int startYear = Integer.parseInt(startArray[0]);
int startMonth = Integer.parseInt(startArray[1]);
int endYear = Integer.parseInt(endArray[0]);
int endMonth = Integer.parseInt(endArray[1]);
return Math.abs((endYear - startYear) * 12 + endMonth - startMonth);
}
/**
*
* @author liheng
* 获得特定日期之后的固定天数的某一天
* @param date 传入的日期
* @param days 要增加的天数
* @return Date 获取的目标日期
* @exception
* @since 1.0.0
*/
public static Date addDays(Date date,int days){
Date date1 = null;
try{
if(null==date ){
return date1;
}
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, days);
date1 = calendar.getTime();
}catch(Exception e){
e.printStackTrace();
}finally{
return date1;
}
}
/**
*
* @author liheng
* 获得日期相减后的天数
* @param minuendDate 被减数日期
* @param subDate 减数日期
* @return long 相差的天数
* @exception
* @since 1.0.0
*/
public static int subDate(Date minuendDate,Date subDate){
if(minuendDate!=null && subDate!=null ){
long timeMillions=(minuendDate.getTime()-subDate.getTime())%(24*60*60*1000);
int days= new Long((minuendDate.getTime()-subDate.getTime())/(24*60*60*1000)).intValue();
if(timeMillions==0){
return days;
}else{
return days+1;
}
}else{
return 0;
}
}
}