DateUtil

//有些地方需要修改
 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
 
public class DateUtil {
    private final static String[] CN_Digits = { "〇", "一", "二", "三", "四", "五",
        "六", "七", "八", "九", "十" };
public static final long daySpan = 24 * 60 * 60 * 1000;
/**yyyy-MM-dd HH:mm:ss*/
public static final String TIME_FORMAT_NORMAL = "yyyy-MM-dd HH:mm:ss";
/**yyyy-MM-dd*/
public static final String DATE_FORMAT_NORMAL = "yyyy-MM-dd";
/**yyyy.MM.dd*/
public static final String DATE_FORMAT_DOT = "yyyy.MM.dd";
/**yyyyMMdd*/
public static final String DATE_FORMAT_NO_MINUS = "yyyyMMdd";
/**yyMMdd*/
public static final String DATE_FORMAT_NO_MINUS_SHORT = "yyMMdd";
/**yyyy-MM*/
public static final String MONTH_FORMAT_NORMAL = "yyyy-MM";
/**MM-dd*/
public static final String MONTH_DAY_FORMAT = "MM-dd";
/**yyyyMMdd*/
public static final String DATE_FORMAT_SHORT = "yyyyMMdd";
/**yyyyMM*/
public static final String MONTH_FORMAT = "yyyyMM";
/**yyyy.MM*/
public static final String MONTH_FORMAT_DOT = "yyyy.MM";
/**yyyyMMddHHmm*/
public static final String DATE_FORMAT_MINUTE = "yyyyMMddHHmm";
/**yyyyMMddHHmmss*/
private static final String TIME_FORMAT_SHORT = "yyyyMMddHHmmss";
/**MM/dd/yyyy HH:mm:ss**/
public static final String MONTH_DAY_YEAR_HOUR_MINUTE  ="MM/dd/yyyy HH:mm:ss"; 
 
/**
 * 判断参数year、month、day能否组成一个合法的日期。
 *
 * @param month
 *            月份,合法月份范围是 1-12
 * @param day
 *            日数
 * @param year
 *            年份,必须大于1900
 * @return
 */
public static boolean isDate(int month, int day, int year) {
    if (year < 1900) {
        return false;
    }
    if (month < 1 || month > 12) {
        return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
 
    // 判断年份是否为闰年
    @SuppressWarnings("unused")
    boolean leapYear = isLeapYear(year);
    // 获得该年该月的最大日期
    int maxD = getMaxDay(year, month);
    if (day > maxD) {
        return false;
    }
 
    return true;
}
 
/**
 * 给定一个年份和月份,可以得到该月的最大日期。 例如 2009年1月,最大日期为31。
 *
 * @param year
 *            年份,必须大于1900
 * @param month
 *            月份,合法月份范围是 1-12
 * @return
 */
public static int getMaxDay(int year, int month) {
    if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
        return 30;
    }
    if (month == 2) {
        if (isLeapYear(year)) {
            return 29;
        } else {
            return 28;
        }
    }
    return 31;
}
 
/**
 * 判断年份是否为闰年。
 *
 * @param year
 *            年份,必须大于1900
 * @return
 */
public static boolean isLeapYear(int year) {
    boolean leapYear = ((year % 400) == 0);
    if (!leapYear) {
        leapYear = ((year % 4) == 0) && ((year % 100) != 0);
    }
    return leapYear;
}
 
 
public static String getCurrentStringTime(){
    Date date=new Date();
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
    String formatDate=format.format(date);
    return formatDate;
}
 
public static String getCurrentTimeSecond(){
    Date date=new Date();
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String formatDate=format.format(date);
    return formatDate;
}
/**
 * yyyy-MM-dd HH:mm:ss格式串转换为日期
 * @param yyyy-MM-dd HH:mm:ss 格式日期
 * @return Date日期
 */
public static Date paseDate(String formatDate){
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=null;
    try {
        date = format.parse(formatDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
}
public static String getCurrentTimeMilliSecond(){
    Date date=new Date();
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
    String formatDate=format.format(date);
    return formatDate;
}
 
public static String getCurrentMonth(){
    Date date=new Date();
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM");
    String formatDate=format.format(date);
    return formatDate;
}
/**
 * 获取当前日期(格式为20110802)
 * @return
 */
public static String getCurrentDay(){
    Date date=new Date();
    SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd");
    String formatDate=format.format(date);
    return formatDate;
}
/**
 * 获取当前时间
 * @param format 时间格式,例如:yyyy-MM-dd
 * @param count 增加或减少的天数
 * @return
 */
public static String getCurrentDate(String format,Integer count) {
    java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(format);
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.DATE, count);//增加或减少的天数
    String currentDate = df.format(cal.getTime());
    return currentDate;
}
 
/**
 * 增加月份后的日期数
 * @param countMoney
 * @return
 */
 public static String getDateAddMoney(String dateStr, int m) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = df.parse(dateStr);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.MONTH, m);
            return df.format(calendar.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
  }
 
 
/**
 * 获取下个月的第一天
 * @param time
 * @param format
 * @return
 */
public static String getNextMonthFirstDay(String format) {
    java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(format);
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MONTH, 1);// 当前月+1,即下个月
    cal.set(Calendar.DATE, 1);// 将下个月1号作为日期初始值
    String currentMonth = df.format(cal.getTime());
    return currentMonth;
}
 
/**
 * 获取下个月的最后一天
 * @param time
 * @param format
 * @return
 */
public static String getNextMonthLastDay(String format) {
    java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(format);
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DATE, 1);// 将下2个月1号作为日期初始值    
    cal.add(Calendar.MONTH, 2);// 当前月+2,即下2个月
    cal.add(Calendar.DATE, -1);// 下2个月1号减去一天,即得到下1一个月最后一天
    String currentMonth = df.format(cal.getTime());
    return currentMonth;
}
 
public static String format(Date date) {
    if(null==date){
        return null;
    }
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String formatDate=format.format(date);
    return formatDate;
}
 
public static String format(Date date, String formatStr) {
    SimpleDateFormat format = new SimpleDateFormat(formatStr);
    String formatDate=format.format(date);
    return formatDate;
}
 
public static String format4Null(Date date, String formatStr) {
     
    if(date == null) {
        return null;
    } else {
         
        return format(date, formatStr);
    }
}
 
/**
 * 得到2个字符串日期之间的日期差,返回结果以秒为单位
 * @param beginTime
 * @param endTime
 * @return
 * @throws ParseException
 */
public static Long getOffTime(String beginTime, String endTime)  {
    SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     
    try{
    java.util.Date begin = dfs.parse(beginTime);
    java.util.Date end = dfs.parse(endTime);
    long between = (end.getTime() - begin.getTime()) / 1000;// 除以1000是为了转换成秒
    return between;
    }catch(Exception e){
        e.printStackTrace();
    }
    return null;
}
 
public static String getYesterday(){
    return getCurrentDate("yyyy-MM-dd",-1)+" 00:00:00";
}
 
public static String getToday(){
    return getCurrentDate("yyyy-MM-dd",0)+" 00:00:00";
}
 
public static void  main(String args[]){
}
 
 
/**
 * 昨天的起始终止
 * &gt;=起始 &lt;终止
 * @param nowTime
 * @return
 */
public static Pair<Long, Long> getLastDay(long nowTime){
    try{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
        String s = sdf.format(new Date(nowTime));
        Date yesdEnd = sdf.parse(s);
         
        return new Pair<Long, Long>(yesdEnd.getTime() - daySpan, yesdEnd.getTime());
    }catch (Exception e) {
        throw new RuntimeException(e);
    }
}
 
/**
 * 取得上一个自然周起始(返回最近的周日0点为结束,之前一个周日0点为开始)
 * &gt;=起始 &lt;终止
 * @param nowTime
 * @return
 */
public static Pair<Long, Long> getLastNativeWeek(long nowTime){
    try{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
        String s = sdf.format(new Date(nowTime));
        Date yesdEnd = sdf.parse(s);    // 今天0点
 
        Calendar c = Calendar.getInstance();
        c.setTime(yesdEnd);
        c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        long weekEnd = c.getTimeInMillis();
        return new Pair<Long, Long>(weekEnd - daySpan * 7, weekEnd);
    }catch (Exception e) {
        throw new RuntimeException(e);
    }
}
 
/**
 * 取得上一个月的起始
 * &gt;=起始 &lt;终止
 * @param nowTime
 * @return
 */
public static Pair<Long, Long> getLastMonth(long nowTime){
    try{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-01 00:00:00");
        String s = sdf.format(new Date(nowTime));
        Date lmEnd = sdf.parse(s);  // 本月1号0点
         
        Calendar c = Calendar.getInstance();
        c.setTime(lmEnd);
        c.add(Calendar.MONTH,  -1);
 
        return new Pair<Long, Long>(c.getTimeInMillis(), lmEnd.getTime());
    }catch (Exception e) {
        throw new RuntimeException(e);
    }
}
 
/**
 * 计算两个日期之间相差的月数
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @return 两个日期之间相差的月数
 */
public static int dateIntervalMonth(Date startDate, Date endDate) {
     
    int intervalMonth = 0;
    try {
        if(startDate==null || endDate==null){
            return intervalMonth;
        }
        Calendar starCal = Calendar.getInstance();
        starCal.setTime(startDate);
 
        int sYear = starCal.get(Calendar.YEAR);
        int sMonth = starCal.get(Calendar.MONTH);
 
        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);
        int eYear = endCal.get(Calendar.YEAR);
        int eMonth = endCal.get(Calendar.MONTH);
 
        intervalMonth = ((eYear - sYear) * 12 + (eMonth - sMonth));
    } catch (Exception e) {
        intervalMonth = 0;
    }
     
    return intervalMonth;
}
 
/***
 * 根据所选格式将字符串转换为日期类型
 * @param dateStr  待转换的字符串
 * @param formateRule 转换格式
 * @return 日期类型结果
 */
public static Date convertAsDate(String dateStr, String formateRule) {
    DateFormat fmt = new SimpleDateFormat(formateRule);
    try {
        if(dateStr == null) {
            return null;
        }
        return fmt.parse(dateStr);
    } catch (ParseException e) {
        return null;
    }
}
/**
 * 自动把String时间转成Date类型
 * @param dateStr
 * @return
 */
public static Date autoConvertAsDate(String dateStr){
    try {
        if(null ==dateStr){
            return null;
        }
      Object obj = StringUtils.convert(dateStr, Date.class);
      if(null!=obj){
          return (Date)obj;
      }else{
          return null;
      }
    } catch (Exception e) {
        return null;
    }
}
 
public static SimpleDateFormat newTimeFormater(){
    return new SimpleDateFormat(TIME_FORMAT_NORMAL);
}
/****
 * 计算时间差,返回秒
 * @param start
 * @param end
 * @return
 */
public static long timeDifference(long start,long end){
    return (end-start)/1000;
}
 
 
/* 判断输入的字符串是否是合法的生日 生日不能大于当前日期,支持  yyyy-MM-dd ,yyyyMMdd  MM-dd-yyyy  ,yyyy年MM月dd日等
 * @param birthday 一个日期格式的字符串
 * @param formats  期望转换后的日期格式数组
 * @return
 * */
 public static boolean isRightDate(String birthday,String[] formats){
       
      //记录传入的日期字符串,转换成日期类型
      Date birth=null;
       
      //判断格式是否正确,默认值为false
      boolean isRight=false;
      for(String f:formats){
           try {
                birth =new SimpleDateFormat(f).parse(birthday);
                //校验日期转换后是和传入的值不相同,说明日期传入有问题
                if(!new SimpleDateFormat(f).format(birth).equals(birthday)){
                    return false;
                }
                isRight=true;
                break;
           } catch (ParseException e) {}
      }
       
      if(isRight){
           //获取当前日期的毫秒数
           long now =new Date().getTime();
           //获取生日的毫秒数
           long birthTime = birth.getTime();
           //如果当前时间小于生日,生日不合法。反之合法
           return birthTime<=now;
      }else{
           //输入的参数类型不是日期类型,或者类型和过滤中设置的类型不匹配
           return false;
      }
 }
 /***
  * 计算时间差,返回天数
  * @param b_date 大时间
  * @param s_date 小时间
  * @return 天数
  */
 public static long dateSubtract(Date b_date,Date s_date){
     if(StringUtils.blank(s_date) || StringUtils.blank(b_date)){
         return 0;
     }else{
         long dateLong1 = b_date.getTime();
         long dateLong2 = s_date.getTime();
         long day = (dateLong1-dateLong2)/1000/60/60/24;
         return day;
     }
 }
}

 

posted on 2014-12-15 08:55  java界的奥特曼  阅读(245)  评论(0编辑  收藏  举报