content: /*
   * Copyright (C) 2016 alchemystar, Inc. All Rights Reserved.
   */
  package alchemystar.lancelot.route.util;
  
  import java.text.ParseException;
  import java.text.SimpleDateFormat;
  import java.util.Calendar;
  import java.util.Date;
  import java.util.Locale;
  
  import org.apache.commons.lang.RandomStringUtils;
  import org.apache.commons.lang.time.DateUtils;
  
  /**
   * @author lizhuyang
   */
  public final class DateUtil extends DateUtils {
  
      /** yyyyMMdd */
      public final static String SHORT_FORMAT           = "yyyyMMdd";
  
      /** yyyyMMddHHmmss */
      public final static String LONG_FORMAT            = "yyyyMMddHHmmss";
  
      /** yyyy-MM-dd */
      public final static String WEB_FORMAT             = "yyyy-MM-dd";
  
      /** HHmmss */
      public final static String TIME_FORMAT            = "HHmmss";
  
      /** yyyyMM */
      public final static String MONTH_FORMAT           = "yyyyMM";
  
      /** yyyy年MM月dd日 */
      public final static String CHINA_FORMAT           = "yyyy年MM月dd日";
  
      /** yyyy-MM-dd HH:mm:ss */
      public final static String LONG_WEB_FORMAT        = "yyyy-MM-dd HH:mm:ss";
  
      /** yyyy-MM-dd HH:mm */
      public final static String LONG_WEB_FORMAT_NO_SEC = "yyyy-MM-dd HH:mm";
  
      /**
       * 日期对象解析成日期字符串基础方法，可以据此封装出多种便捷的方法直接使用
       * 
       * @param date 待格式化的日期对象
       * @param format 输出的格式
       * @return 格式化的字符串
       */
      public static String format(Date date, String format) {
          if (date == null || StringUtil.isBlank(format)) {
              return StringUtil.EMPTY;
          }
  
          return new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE).format(date);
      }
  
      /**
       * 格式化当前时间
       * 
       * @param format 输出的格式
       * @return
       */
      public static String formatCurrent(String format) {
          if (StringUtil.isBlank(format)) {
              return StringUtil.EMPTY;
          }
  
          return format(new Date(), format);
      }
  
      /**
       * 日期字符串解析成日期对象基础方法，可以在此封装出多种便捷的方法直接使用
       * 
       * @param dateStr 日期字符串
       * @param format 输入的格式
       * @return 日期对象
       * @throws ParseException 
       */
      public static Date parse(String dateStr, String format) throws ParseException {
          if (StringUtil.isBlank(format)) {
              throw new ParseException("format can not be null.", 0);
          }
  
          if (dateStr == null || dateStr.length() < format.length()) {
              throw new ParseException("date string's length is too small.", 0);
          }
  
          return new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE).parse(dateStr);
      }
  
      /**
       * 日期字符串格式化基础方法，可以在此封装出多种便捷的方法直接使用
       * 
       * @param dateStr 日期字符串
       * @param formatIn 输入的日期字符串的格式
       * @param formatOut 输出日期字符串的格式
       * @return 已经格式化的字符串
       * @throws ParseException
       */
      public static String format(String dateStr, String formatIn, String formatOut)
                                                                                    throws ParseException {
  
          Date date = parse(dateStr, formatIn);
          return format(date, formatOut);
      }
  
      /**
       * 把日期对象按照<code>yyyyMMdd</code>格式解析成字符串
       * 
       * @param date 待格式化的日期对象 
       * @return 格式化的字符串
       */
      public static String formatShort(Date date) {
          return format(date, SHORT_FORMAT);
      }
  
      /**
       * 把日期字符串按照<code>yyyyMMdd</code>格式，进行格式化
       * 
       * @param dateStr 待格式化的日期字符串
       * @param formatIn 输入的日期字符串的格式 
       * @return 格式化的字符串
       */
      public static String formatShort(String dateStr, String formatIn) throws ParseException {
          return format(dateStr, formatIn, SHORT_FORMAT);
      }
  
      /**
       * 把日期对象按照<code>yyyy-MM-dd</code>格式解析成字符串
       * 
       * @param date 待格式化的日期对象 
       * @return 格式化的字符串
       */
      public static String formatWeb(Date date) {
          return format(date, WEB_FORMAT);
      }
  
      /**
       * 把日期字符串按照<code>yyyy-MM-dd</code>格式，进行格式化
       * 
       * @param dateStr 待格式化的日期字符串
       * @param formatIn 输入的日期字符串的格式 
       * @return 格式化的字符串
       * @throws ParseException 
       */
      public static String formatWeb(String dateStr, String formatIn) throws ParseException {
          return format(dateStr, formatIn, WEB_FORMAT);
      }
  
      /**
       * 把日期对象按照<code>yyyyMM</code>格式解析成字符串
       * 
       * @param date 待格式化的日期对象 
       * @return 格式化的字符串
       */
      public static String formatMonth(Date date) {
  
          return format(date, MONTH_FORMAT);
      }
  
      /**
       * 把日期对象按照<code>HHmmss</code>格式解析成字符串
       * 
       * @param date 待格式化的日期对象 
       * @return 格式化的字符串
       */
      public static String formatTime(Date date) {
          return format(date, TIME_FORMAT);
      }
  
      /**
       * 获取yyyyMMddHHmmss+n位随机数格式的时间戳
       * 
       * @param n 随机数位数
       * @return
       */
      public static String getTimestamp(int n) {
          return formatCurrent(LONG_FORMAT) + RandomStringUtils.randomNumeric(n);
      }
  
      /**
       * 根据日期格式返回昨日日期
       * 
       * @param format 日期格式
       * @return
       */
      public static String getYesterdayDate(String format) {
          return getDateCompareToday(format, -1, 0);
      }
  
      /**
       * 把当日日期作为基准，按照格式返回相差一定间隔的日期
       *
       * @param format 日期格式
       * @param daysAfter 和当日比相差几天，例如3代表3天后，-1代表1天前
       * @param monthAfter 和当日比相差几月，例如2代表2月后，-3代表3月前
       * @return
       */
      public static String getDateCompareToday(String format, int daysAfter, int monthAfter) {
          Calendar today = Calendar.getInstance();
          if (daysAfter != 0) {
              today.add(Calendar.DATE, daysAfter);
          }
          if (monthAfter != 0) {
              today.add(Calendar.MONTH, monthAfter);
          }
          return format(today.getTime(), format);
      }
  
      /**
       * 根据日期格式返回上月的日期
       * 
       * @param format
       * @return
       */
      public static String getLastMonth(String format) {
          Calendar today = Calendar.getInstance();
          today.add(Calendar.MONTH, -1);
          return format(today.getTime(), format);
      }
  
      /**
       * 平移当前时间，以分为单元，minutes
       * 
       * @param minutes
       * @return
       */
      public static Date addCurMin(long minutes) {
          return DateUtils.addMinutes(new Date(), (int) minutes);
      }
  
      /**
       * 平移当前时间，以秒为单元，minutes
       * 
       * @param secs
       * @return
       */
      public static Date addCurSeconds(long secs) {
          return addSeconds(new Date(), (int) secs);
      }
  }
  