View Javadoc
1   package gboat2.base.bridge.util;
2   
3   import java.text.ParseException;
4   import java.util.Calendar;
5   import java.util.Date;
6   
7   import org.apache.commons.lang3.time.DateFormatUtils;
8   import org.apache.commons.lang3.time.DateUtils;
9   import org.slf4j.Logger;
10  import org.slf4j.LoggerFactory;
11  
12  /**
13   * 日期操作的工具类,建议优先使用 {@link org.apache.commons.lang3.time.DateUtils} 和
14   * {@link org.apache.commons.lang3.time.DateFormatUtils} 中的方法对日期对象和日历对象进行操作
15   * 
16   * @date 2013-12-5
17   * @author hemw
18   */
19  public abstract class DateUtil {
20  	
21  	private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
22  	
23  	/** 日期格式:{@value} */
24  	public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
25  
26  	/** 日期格式:{@value} */
27  	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
28  	
29  	/** 日期格式:{@value} */
30      public static final String ZH_DATETIME_FORMAT = "yyyy年M月d日 H时m分s秒";
31  	
32      /** 日期格式:{@value} */
33      public static final String ZH_DATE_FORMAT = "yyyy年M月d日";
34  
35      /** 日期格式:{@value} */
36      public static final String RFC3339_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
37  	
38      /** 日期格式:{@value} */
39      public static final String SHORT_DATE_FORMAT = "yyMMdd";
40  	
41      /** 日期格式:{@value} */
42      public static final String YYYYMMDD_FORMAT = "yyyyMMdd";
43  	
44      /** 日期格式:{@value} */
45      public static final String SECOND_FORMAT = "yyyyMMddHHmmss";
46  	
47      /** 日期格式:{@value} */
48      public static final String YYMMDDHHMMSS = "yyMMddHHmmss";
49  	
50      /** 日期格式:{@value} */
51      public static final String MILLISECOND_FORMAT = "yyyyMMddHHmmssSSS";
52      
53      /**
54       * 将字符串转换成 {@link java.util.Date} 对象时,支持的日期格式:
55       *  <ul>
56       *  <li>yyyy-MM-dd HH:mm:ss.SSS</li>
57       *  <li>yyyy-MM-dd HH:mm:ss</li>
58       *  <li>yyyy-MM-dd HH:mm</li>
59       *  <li>yyyy-MM-dd</li>
60       *  <li>yyyy-MM-dd'T'HH:mm:ss.SSS</li>
61       *  <li>yyyy-MM-dd'T'HH:mm:ss</li>
62       *  <li>yyyy-MM-dd'T'HH:mm</li>
63       *  <li>yyyy/MM/dd HH:mm:ss.SSS</li>
64       *  <li>yyyy/MM/dd HH:mm:ss</li>
65       *  <li>yyyy/MM/dd HH:mm</li>
66       *  <li>yyyy/MM/dd</li>
67       *  <li>yyyy年MM月dd日 HH时mm分ss秒</li>
68       *  <li>yyyy年MM月dd日 HH时mm分</li>
69       *  <li>yyyy年MM月dd日</li>
70       *  <li>yyyyMMddHHmmssSSS</li>
71       *  <li>yyyyMMddHHmmss</li>
72       *  <li>yyyyMMddHHmm</li>
73       *  <li>yyyyMMdd</li>
74       *  </ul>
75       */
76      public static final String[] SUPPORT_FORMATS = new String[] {
77          "yyyy-MM-dd HH:mm:ss.SSS",
78          "yyyy-MM-dd HH:mm:ss",
79          "yyyy-MM-dd HH:mm",
80          "yyyy-MM-dd",
81          "yyyy-MM-dd'T'HH:mm:ss.SSS",
82          "yyyy-MM-dd'T'HH:mm:ss",
83          "yyyy-MM-dd'T'HH:mm",
84          "yyyy/MM/dd HH:mm:ss.SSS",
85          "yyyy/MM/dd HH:mm:ss",
86          "yyyy/MM/dd HH:mm",
87          "yyyy/MM/dd",
88          "yyyy年MM月dd日 HH时mm分ss秒",
89          "yyyy年MM月dd日 HH时mm分",
90          "yyyy年MM月dd日",
91          "yyyyMMddHHmmssSSS",
92          "yyyyMMddHHmmss",
93          "yyyyMMddHHmm",
94          "yyyyMMdd"
95      };
96  
97      /**
98       * 将日期格式化为 {@value #DEFAULT_DATETIME_FORMAT} 形式的字符串
99       * @param date 格式化后的日期字符串,如果值为 {@code null},则返回 {@code null}
100      * @return 格式化后的日期字符串
101      * @since 2.1.2-SNAPSHOT
102      * @see org.apache.commons.lang3.time.DateFormatUtils#format(Date, String)
103      */
104     public static String format(Date date) {
105         return (date == null) ? null : DateFormatUtils.format(date, DEFAULT_DATETIME_FORMAT);
106     }
107 
108     /**
109      * 将日期格式化为 {@value #DEFAULT_DATE_FORMAT} 形式的字符串
110      * 
111      * @param date
112      *            要格式化的日期对象,值为 <code>null</code> 时,返回“无”
113      * @return 格式化后的日期字符串,如果传入的 {@code date}
114      *         为 <code>null</code>,则,返回“无”
115      * @since 2.1.2-SNAPSHOT
116      */
117     public static String formatWithDefault(Date date) {
118         return format(date, DEFAULT_DATE_FORMAT, "无");
119     }
120 
121     /**
122      * 格式化日期
123      * @param date 要格式化的日期对象,为 <code>null</code> 时,返回 {@code defaultValue}
124      * @param pattern 日期格式
125      * @param defaultValue {@code date} 为 {@code null} 时返回的默认值
126      * @return 格式化后的日期字符串,如果传入的 {@code date} 为 <code>null</code>,则返回 {@code defaultValue}
127      * @since 2.1.2-SNAPSHOT
128      * @see org.apache.commons.lang3.time.DateFormatUtils#format(Date, String)
129      */
130     public static String format(Date date, String pattern, String defaultValue) {
131         return (date == null) ? defaultValue : DateFormatUtils.format(date, pattern);
132     }
133     
134     /**
135      * 将日期字符串解析成日期对象
136      * @param date 日期字符串,允许的格式为:
137      * <ul>
138      * <li>yyyy-MM-dd HH:mm:ss</li>
139      * <li>yyyy-MM-dd</li>
140      * <li>yyyy年M月d日H点m分s秒</li>
141      * <li>yyyy年M月d日</li>
142      * <li>yyyy-MM-dd'T'HH:mm:ss</li>
143      * <li>yyMMdd</li>
144      * <li>yyyyMMdd</li>
145      * <li>yyyyMMddHHmmss</li>
146      * <li>yyMMddHHmmss</li>
147      * <li>yyyyMMddHHmmssSSS"</li>
148      * </ul>
149      * @return 对应的日期对象,如果解析失败,则返回 <code>null</code>
150      * @see #parse(String, String...)
151      * @since 2.1.2-SNAPSHOT
152      * @see #parse(String, String...)
153      */
154     public static Date parse(String date) {
155         return parse(date, DEFAULT_DATETIME_FORMAT, DEFAULT_DATE_FORMAT,
156                 ZH_DATETIME_FORMAT, ZH_DATE_FORMAT, RFC3339_FORMAT,
157                 SHORT_DATE_FORMAT, YYYYMMDD_FORMAT, SECOND_FORMAT,
158                 YYMMDDHHMMSS, MILLISECOND_FORMAT);
159     }
160     
161 	/**
162 	 * 解析日期
163 	 * @param date 指定的日期字符串
164 	 * @param format 日期格式,可以使用本类中的一些静态变量,如 :<code>DEFAULT_DATETIME_FORMAT</code>
165 	 * @return Date 返回对应的日期对象,如果解析失败,则返回 <code>null</code>
166 	 * @see org.apache.commons.lang3.time.DateUtils#parseDate(String, String...)
167 	 */
168 	public static Date parse(String date, String... format) {
169 		Date dt = null;
170 		try {
171 			dt = DateUtils.parseDate(date, format);
172 		} catch (ParseException e) {
173 			logger.warn(e.toString());
174 		}
175 		return dt;
176 	}
177 	
178 	/**
179 	 * 取得当月第一天0时0分0秒
180 	 * @return 当月第一天0时0分0秒
181      * @since 2.1.2-SNAPSHOT
182      * @see #getFirstDayOfMonth(Date)
183 	 */
184 	public static Date getFirstDayOfMonth() {
185 	    return getFirstDayOfMonth(Calendar.getInstance().getTime());
186 	}
187 
188     /**
189      * 取得指定日期所属月份的第一天0时0分0秒
190      * @param date 日期对象
191      * @return {@code date} 所属月份第一天0时0分0秒
192      * @since 2.1.2-SNAPSHOT
193      * @see org.apache.commons.lang3.time.DateUtils#truncate(Date, int)
194      */
195     public static Date getFirstDayOfMonth(Date date) {
196         return DateUtils.truncate(date, Calendar.MONTH);
197     }
198     
199     /**
200      * 取得当月第一天当月第一天0时0分0秒的字符串形式,返回的格式为 {@value #DEFAULT_DATETIME_FORMAT}
201      * @return 当月第一天当月第一天0时0分0秒的字符串形式
202      * @since 2.1.2-SNAPSHOT
203      * @see #getFirstDayOfMonthAsString(Date)
204      */
205     public static String getFirstDayOfMonthAsString() {
206         return getFirstDayOfMonthAsString(Calendar.getInstance().getTime());
207     }
208 
209     /**
210      * 取得指定日期所属月份的第一天0时0分0秒的字符串形式,返回的格式为 {@value #DEFAULT_DATETIME_FORMAT}
211      * @param date 日期对象
212      * @return {@code date} 所属月份第一天0时0分0秒的字符串形式
213      * @since 2.1.2-SNAPSHOT
214      * @see #getFirstDayOfMonth(Date)
215      * @see org.apache.commons.lang3.time.DateFormatUtils#format(Date, String)
216      */
217     public static String getFirstDayOfMonthAsString(Date date) {
218         return DateFormatUtils.format(getFirstDayOfMonth(date), DEFAULT_DATETIME_FORMAT);
219     }
220     
221     /**
222      * 取得当月最后一天23时59分59秒
223      * @return 当月最后一天23时59分59秒
224      * @since 2.1.2-SNAPSHOT
225      * @see #getLastDayOfMonth(Date)
226      */
227     public static Date getLastDayOfMonth() {
228         return getLastDayOfMonth(Calendar.getInstance().getTime());
229     }
230     
231     /**
232      * 取得指定日期所属月份的最后一天23时59分59秒
233      * @param date 日期对象
234      * @return 当月最后一天23时59分59秒
235      * @since 2.1.2-SNAPSHOT
236      * @see org.apache.commons.lang3.time.DateUtils#ceiling(Calendar, int)
237      */
238     public static Date getLastDayOfMonth(Date date) {
239         Calendar c = Calendar.getInstance();
240         c.setTime(date);
241         
242         // 获取到下月第一天0时0分0秒
243         c = DateUtils.ceiling(c, Calendar.MONTH);
244         // 往前推移一微秒,即获取到了本月最后一天23时59分59秒
245         c.add(Calendar.MILLISECOND, -1);
246         return c.getTime();
247     }
248     
249     /**
250      * 取得当月最后一天23时59分59秒的字符串形式,返回的格式为 {@value DEFAULT_DATETIME_FORMAT}
251      * @return 当月最后一天23时59分59秒的字符串形式
252      * @since 2.1.2-SNAPSHOT
253      * @see #getLastDayOfMonthAsString(Date)
254      */
255     public static String getLastDayOfMonthAsString() {
256         return getLastDayOfMonthAsString(Calendar.getInstance().getTime());
257     }
258 
259     /**
260      * 取得当月最后一天23时59分59秒的字符串形式,返回的格式为 {@value DEFAULT_DATETIME_FORMAT}
261      * @param date 日期对象
262      * @return {@code date} 所属月份最后一天23时59分59秒的字符串形式
263      * @since 2.1.2-SNAPSHOT
264      * @see #getLastDayOfMonth(Date)
265      * @see org.apache.commons.lang3.time.DateFormatUtils#format(Date, String)
266      */
267     public static String getLastDayOfMonthAsString(Date date) {
268         return DateFormatUtils.format(getLastDayOfMonth(), DEFAULT_DATETIME_FORMAT);
269     }
270     
271     /**
272 	 *  返回dateFrom到dateTo相隔天数
273 	 *  1.只比较日期,不管时分秒
274 	 *  2.当dateFrom在dateTo之后时候返回负数
275 	 *  @param begin
276 	 *  @param end
277 	 *  @return
278 	 *  @author xiongyh
279 	 *  @date 2014-4-24
280 	 **/
281     public static int getDaysBetween(Date begin, Date end) {
282 		if ((null != begin) && (null != end)) {
283 			long dateFromTime = DateUtils.truncate(begin, Calendar.DATE).getTime();
284 			long dateToTime = DateUtils.truncate(end, Calendar.DATE).getTime();
285 			long dateRange = (dateToTime - dateFromTime) / DateUtils.MILLIS_PER_DAY;
286 			return (int) dateRange;
287 		}
288 		return 0;
289 	}
290 
291     /**
292      * 日期转化为汉字格式
293      * 
294      * @author liuliang
295      * @param date
296      * @return 传入日期的汉字版(eg.二O一四年十二月五日)
297      */
298     public static String dataToUpper(Date date) {
299         if (date == null)
300             return "";
301         Calendar ca = Calendar.getInstance();
302         ca.setTime(date);
303         int year = ca.get(Calendar.YEAR);
304         int month = ca.get(Calendar.MONTH) + 1;
305         int day = ca.get(Calendar.DAY_OF_MONTH);
306         return numToUpper(year) + "年" + monthToUppder(month) + "月" + dayToUppder(day) + "日";
307     }
308 
309     // 将数字转化为大写
310     private static String numToUpper(int num) {
311         // String u[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
312         String u[] = { "O", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
313         char[] str = String.valueOf(num).toCharArray();
314         String rstr = "";
315         for (int i = 0; i < str.length; i++) {
316             rstr = rstr + u[Integer.parseInt(str[i] + "")];
317         }
318         return rstr;
319     }
320 
321     // 月转化为大写
322     private static String monthToUppder(int month) {
323         if (month < 10) {
324             return numToUpper(month);
325         } else if (month == 10) {
326             return "十";
327         } else {
328             return "十" + numToUpper(month - 10);
329         }
330     }
331 
332     // 日转化为大写
333     private static String dayToUppder(int day) {
334         if (day < 20) {
335             return monthToUppder(day);
336         } else {
337             char[] str = String.valueOf(day).toCharArray();
338             if (str[1] == '0') {
339                 return numToUpper(Integer.parseInt(str[0] + "")) + "十";
340             } else {
341                 return numToUpper(Integer.parseInt(str[0] + "")) + "十"
342                         + numToUpper(Integer.parseInt(str[1] + ""));
343             }
344         }
345     }
346 }