天天看點

為大家提供一個好的時間工具類DateTime

雖然網上有什麼date4j,但是jar太糾結了,先給出源碼,可以繼承到自己的util包中,作為一個資深程式員,我相信都有不少好的util工具類,我也希望經過此次分享,能帶動技術大牛們能分享出自己的好用的工具類。

先看源碼

[java] view plain copy print ?

  1. package com.ansitech.core.system;  
  2. import java.io.Serializable;  
  3. import java.text.DateFormat;  
  4. import java.text.ParseException;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Calendar;  
  7. import java.util.Date;  
  8. public class DateTime implements Serializable {  
  9.     public static final String DEFAULT_DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";  
  10.     public static final String DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN = "yyyy-MM-dd HH:mm";  
  11.     public static final String DEFAULT_DATE_TIME_HH_FORMAT_PATTERN = "yyyy-MM-dd HH";  
  12.     public static final String DEFAULT_DATE_FORMAT_PATTERN = "yyyy-MM-dd";  
  13.     public static final String DEFAULT_TIME_FORMAT_PATTERN = "HH:mm:ss";  
  14.     public static final String DEFAULT_TIME_HHmm_FORMAT_PATTERN = "HH:mm";  
  15.     public static final int YEAR_FIELD = java.util.Calendar.YEAR;  
  16.     public static final int MONTH_FIELD = java.util.Calendar.MONTH;  
  17.     public static final int DAY_FIELD = java.util.Calendar.DATE;  
  18.     public static final int HOUR_FIELD = java.util.Calendar.HOUR_OF_DAY;  
  19.     public static final int MINUTE_FIELD = java.util.Calendar.MINUTE;  
  20.     public static final int SECOND_FIELD = java.util.Calendar.SECOND;  
  21.     public static final int MILLISECOND_FIELD = java.util.Calendar.MILLISECOND;  
  22.     private java.util.Calendar c;   //月曆類  
  23.     public DateTime() {  
  24.         c = Calendar.getInstance();  
  25.         c.clear();  
  26.     }  
  27.     public DateTime(java.util.Date date) {  
  28.         c = Calendar.getInstance();  
  29.         c.setTime(date);  
  30.     }  
  31.     public DateTime(java.util.Calendar calendar) {  
  32.         this.c = calendar;  
  33.     }  
  34.     public static DateTime now() {  
  35.         Calendar calendar = Calendar.getInstance();  
  36.         return new DateTime(calendar);  
  37.     }  
  38.     public DateTime(long milliseconds) {  
  39.         c = Calendar.getInstance();  
  40.         c.setTimeInMillis(milliseconds);  
  41.     }  
  42.     public Date toDate() {  
  43.         return c.getTime();  
  44.     }  
  45.     public java.util.Calendar toCalendar() {  
  46.         return c;  
  47.     }  
  48.     public java.sql.Date toSqlDate() {  
  49.         return new java.sql.Date(c.getTimeInMillis());  
  50.     }  
  51.     public java.sql.Time toSqlTime() {  
  52.         return new java.sql.Time(c.getTimeInMillis());  
  53.     }  
  54.     public java.sql.Timestamp toSqlTimestamp() {  
  55.         return new java.sql.Timestamp(c.getTimeInMillis());  
  56.     }  
  57.     public static DateTime parseTime(String time) throws java.text.ParseException {  
  58.         try {  
  59.             return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_FORMAT_PATTERN);  
  60.         } catch (ParseException e) {  
  61.             return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_HHmm_FORMAT_PATTERN);  
  62.         }  
  63.     }  
  64.     public static DateTime parseDate(String date) throws java.text.ParseException {  
  65.         return DateTime.parseDateTime(date, DateTime.DEFAULT_DATE_FORMAT_PATTERN);  
  66.     }  
  67.     public static DateTime parseDateTime(String datetime) throws java.text.ParseException {  
  68.         DateTime result = null;  
  69.         //嘗試按yyyy-MM-dd HH:mm:ss分析  
  70.         try {  
  71.             result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN);  
  72.         } catch (ParseException e) {  
  73.             //解析錯誤  
  74.             result = null;  
  75.         }  
  76.         //嘗試按yyyy-MM-dd HH:mm分析  
  77.         if (null == result) {  
  78.             try {  
  79.                 result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN);  
  80.             } catch (ParseException e) {  
  81.                 //解析錯誤  
  82.                 result = null;  
  83.             }  
  84.         }  
  85.         //嘗試按yyyy-MM-dd HH分析  
  86.         if (null == result) {  
  87.             try {  
  88.                 result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HH_FORMAT_PATTERN);  
  89.             } catch (ParseException e) {  
  90.                 //解析錯誤  
  91.                 result = null;  
  92.             }  
  93.         }  
  94.         //嘗試按yyyy-MM-dd分析  
  95.         if (null == result) {  
  96.             try {  
  97.                 result = DateTime.parseDate(datetime);  
  98.             } catch (ParseException e) {  
  99.                 //解析錯誤  
  100.                 result = null;  
  101.             }  
  102.         }  
  103.         //嘗試按時間分析  
  104.         if (null == result) {  
  105.             result = DateTime.parseTime(datetime);  
  106.         }  
  107.         return result;  
  108.     }  
  109.     public static DateTime parseDateTime(String datetime, String pattern) throws java.text.ParseException {  
  110.         SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateInstance();  
  111.         fmt.applyPattern(pattern);  
  112.         return new DateTime(fmt.parse(datetime));  
  113.     }  
  114.     public String toDateString() {  
  115.         return toDateTimeString(DateTime.DEFAULT_DATE_FORMAT_PATTERN);  
  116.     }  
  117.     public String toTimeString() {  
  118.         return toDateTimeString(DateTime.DEFAULT_TIME_FORMAT_PATTERN);  
  119.     }  
  120.     public String toDateTimeString() {  
  121.         return toDateTimeString(DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN);  
  122.     }  
  123.     public String toDateTimeString(String pattern) {  
  124.         SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateInstance();  
  125.         fmt.applyPattern(pattern);  
  126.         return fmt.format(c.getTime());  
  127.     }  
  128.     public int get(int field) {  
  129.         //月份需要+1(月份從0開始)  
  130.         if (DateTime.MONTH_FIELD == field) {  
  131.             return c.get(field) + 1;  
  132.         } else {  
  133.             return c.get(field);  
  134.         }  
  135.     }  
  136.     public long getTimeInMillis() {  
  137.         return c.getTimeInMillis();  
  138.     }  
  139.     public void set(int field, int value) {  
  140.         //月份需要-1(月份從0開始)  
  141.         if (DateTime.MONTH_FIELD == field) {  
  142.             c.set(field, value - 1);  
  143.         } else {  
  144.             c.set(field, value);  
  145.         }  
  146.     }  
  147.     public void set(int year, int month, int day) {  
  148.         set(DateTime.YEAR_FIELD, year);  
  149.         set(DateTime.MONTH_FIELD, month);  
  150.         set(DateTime.DAY_FIELD, day);  
  151.     }  
  152.     public void set(int year, int month, int day, int hour) {  
  153.         set(year, month, day);  
  154.         set(DateTime.HOUR_FIELD, hour);  
  155.     }  
  156.     public void set(int year, int month, int day, int hour, int minute) {  
  157.         set(year, month, day, hour);  
  158.         set(DateTime.MINUTE_FIELD, minute);  
  159.     }  
  160.     public void set(int year, int month, int day, int hour, int minute, int second) {  
  161.         set(year, month, day, hour, minute);  
  162.         set(DateTime.SECOND_FIELD, second);  
  163.     }  
  164.     public void set(int year, int month, int day, int hour, int minute, int second, int milliSecond) {  
  165.         set(year, month, day, hour, minute, second);  
  166.         set(DateTime.MILLISECOND_FIELD, milliSecond);  
  167.     }  
  168.     public void add(int field, int amount) {  
  169.         c.add(field, amount);  
  170.     }  
  171.     public void reduce(int field, int amount) {  
  172.         c.add(field, -amount);  
  173.     }  
  174.     public boolean after(Object when) {  
  175.         if (when instanceof DateTime) {  
  176.             return c.after(((DateTime) when).c);  
  177.         }  
  178.         return c.after(when);  
  179.     }  
  180.     public boolean before(Object when) {  
  181.         if (when instanceof DateTime) {  
  182.             return c.before(((DateTime) when).c);  
  183.         }  
  184.         return c.before(when);  
  185.     }  
  186.     @Override  
  187.     public Object clone() {  
  188.         return new DateTime((Calendar) c.clone());  
  189.     }  
  190.     @Override  
  191.     public int hashCode() {  
  192.         return c.hashCode();  
  193.     }  
  194.     @Override  
  195.     public boolean equals(Object obj) {  
  196.         if (obj instanceof DateTime) {  
  197.             return c.equals(((DateTime) obj).toCalendar());  
  198.         }  
  199.         if (obj instanceof Calendar) {  
  200.             return c.equals(obj);  
  201.         }  
  202.         if (obj instanceof java.util.Date) {  
  203.             return c.getTime().equals(obj);  
  204.         }  
  205.         return false;  
  206.     }  
  207. }  

接下來再來看看如何使用:

擷取目前系統時間:DateTime.now(); 傳回的是一個DateTime對象。

一個DateTime對象可以轉換成我們需要的各種日期格式,

例如:Java.util.date 

[java] view plain copy print ?

  1. DateTime.now().toDate();  

大家可能也覺得這個寫法還沒有直接new Date();來得快對不對。

那麼有很多情況是一個字元串,需要轉換成java.util.Date對象,我們該怎麼做呢?

[java] view plain copy print ?

  1. <pre name="code" class="java">new DateTime("2014-10-29").toDate();  

當然也可以是這樣的 [java] view plain copy print ?

  1. new DateTime("2014-10-29 15:19:23").toDate();  

這裡的隻是基礎用法,還有一些情況是将java.util.Date轉換成字元串格式的

可能大家一般會用SimpleDateFormat,但是這個太費事了,我們看看簡單的辦法。

[java] view plain copy print ?

  1. new DateTime(new Date()).toDateString();  

傳回的是 2014-10-29 這種格式的字元串 [java] view plain copy print ?

  1. new DateTime(new Date()).toDateTimeString();  

傳回的是2014-10-29 15:23:23 這種格式的字元串

如果我們需要類似 2014年10月29日 或 2014年10月29日 15時23分34秒 這種格式的怎麼辦呢

[java] view plain copy print ?

  1. new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日");  
  2. new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日 hh時mm分ss秒");