一個好的Java時間工具類DateTime

jopen 10年前發布 | 199K 次閱讀 DateTime Java開發

此類的靈感來源于C#

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

先看源碼

    /* 
     * 岸思科技開發平臺(JAVA) SDK 
     * 
     * Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved. 
     * http://www.ansitech.com/java/sdk/ 
     * 
     * Licensed under the Apache License, Version 2.0 (the "License"); 
     * you may not use this file except in compliance with the License. 
     * You may obtain a copy of the License at 
     * 
     *      http://www.apache.org/licenses/LICENSE-2.0 
     * 
     * Unless required by applicable law or agreed to in writing, software 
     * distributed under the License is distributed on an "AS IS" BASIS, 
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
     * See the License for the specific language governing permissions and 
     * limitations under the License. 
     */  
    package com.ansitech.core.system;  

    import java.io.Serializable;  
    import java.text.DateFormat;  
    import java.text.ParseException;  
    import java.text.SimpleDateFormat;  
    import java.util.Calendar;  
    import java.util.Date;  

    /** 
     * 日期時間類 
     * 
     * <p>對Calendar的封裝,以便于使用</p> 
     * 
     * @author qsyang 
     * @version 1.0 
     */  
    public class DateTime implements Serializable {  

        /** 
         * yyyy-MM-dd HH:mm:ss 格式 
         */  
        public static final String DEFAULT_DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";  
        /** 
         * yyyy-MM-dd HH:mm 格式 
         */  
        public static final String DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN = "yyyy-MM-dd HH:mm";  
        /** 
         * yyyy-MM-dd HH 格式 
         */  
        public static final String DEFAULT_DATE_TIME_HH_FORMAT_PATTERN = "yyyy-MM-dd HH";  
        /** 
         * yyyy-MM-dd 格式 
         */  
        public static final String DEFAULT_DATE_FORMAT_PATTERN = "yyyy-MM-dd";  
        /** 
         * HH:mm:ss 格式 
         */  
        public static final String DEFAULT_TIME_FORMAT_PATTERN = "HH:mm:ss";  
        /** 
         * HH:mm 格式 
         */  
        public static final String DEFAULT_TIME_HHmm_FORMAT_PATTERN = "HH:mm";  
        /** 
         * 年 
         * <p>可以通過DateTime.now().get(DateTime.YEAR_FIELD)來獲取當前時間的年</p> 
         */  
        public static final int YEAR_FIELD = java.util.Calendar.YEAR;  
        /** 
         * 月 
         * <p>可以通過DateTime.now().get(DateTime.MONTH_FIELD)來獲取當前時間的月</p> 
         */  
        public static final int MONTH_FIELD = java.util.Calendar.MONTH;  
        /** 
         * 日 
         * <p>可以通過DateTime.now().get(DateTime.DAY_FIELD)來獲取當前時間的日</p> 
         */  
        public static final int DAY_FIELD = java.util.Calendar.DATE;  
        /** 
         * 小時 <p>可以通過DateTime.now().get(DateTime.HOUR_FIELD)來獲取當前時間的小時</p> 
         */  
        public static final int HOUR_FIELD = java.util.Calendar.HOUR_OF_DAY;  
        /** 
         * 分鐘 <p>可以通過DateTime.now().get(DateTime.MINUTE_FIELD)來獲取當前時間的分鐘</p> 
         */  
        public static final int MINUTE_FIELD = java.util.Calendar.MINUTE;  
        /** 
         * 秒 
         * <p>可以通過DateTime.now().get(DateTime.SECOND_FIELD)來獲取當前時間的秒</p> 
         */  
        public static final int SECOND_FIELD = java.util.Calendar.SECOND;  
        /** 
         * 毫秒 <p>可以通過DateTime.now().get(DateTime.MILLISECOND_FIELD)來獲取當前時間的毫秒</p> 
         */  
        public static final int MILLISECOND_FIELD = java.util.Calendar.MILLISECOND;  
        private java.util.Calendar c;   //日歷類  

        /** 
         * 獲取一個DateTime,此DateTime尚未初始化,表示的時間是1970-1-1 00:00:00.000 
         * <p>要獲取當前系統時間,請用DateTime.now();</p> 
         */  
        public DateTime() {  
            c = Calendar.getInstance();  
            c.clear();  
        }  

        /** 
         * 設置時間 <p>可以傳入一個時間對象,將會被轉換為DateTime類型</p> 
         * 
         * @param date 時間對象 
         */  
        public DateTime(java.util.Date date) {  
            c = Calendar.getInstance();  
            c.setTime(date);  
        }  

        /** 
         * 設置時間 <p>可以傳入一個日歷對象,將會被轉換為DateTime類型</p> 
         * 
         * @param calendar 日歷對象 
         */  
        public DateTime(java.util.Calendar calendar) {  
            this.c = calendar;  
        }  

        /** 
         * 獲取當前系統時間 
         * 
         * @return DateTime 當前系統時間 
         */  
        public static DateTime now() {  
            Calendar calendar = Calendar.getInstance();  
            return new DateTime(calendar);  
        }  

        /** 
         * 用毫秒來設置時間, 時間的基數是1970-1-1 00:00:00.000; <p>比如,new DateTime(1000) 
         * 則表示1970-1-1 00:00:01.000;<br> 用負數表示基礎時間以前的時間</p> 
         * 
         * @param milliseconds 毫秒 
         */  
        public DateTime(long milliseconds) {  
            c = Calendar.getInstance();  
            c.setTimeInMillis(milliseconds);  
        }  

        /** 
         * 轉換為Date類型 
         * 
         * @return Date時間 
         */  
        public Date toDate() {  
            return c.getTime();  
        }  

        /** 
         * 轉換成 日歷對象 
         * 
         * @return Calendar對象 
         */  
        public java.util.Calendar toCalendar() {  
            return c;  
        }  

        /** 
         * 轉換成java.sql.Date(yyyy-MM-dd)日期 
         * 
         * @return java.sql.Date日期 
         */  
        public java.sql.Date toSqlDate() {  
            return new java.sql.Date(c.getTimeInMillis());  
        }  

        /** 
         * 轉換為java.sql.Time(hh:mm:ss)時間 
         * 
         * @return java.sql.Time時間 
         */  
        public java.sql.Time toSqlTime() {  
            return new java.sql.Time(c.getTimeInMillis());  
        }  

        /** 
         * 轉換為java.sql.Timestamp(時間戳) 
         * 
         * @return java.sql.Timestamp時間戳 
         */  
        public java.sql.Timestamp toSqlTimestamp() {  
            return new java.sql.Timestamp(c.getTimeInMillis());  
        }  

        /** 
         * 解析時間 <p>根據DateTime中的DEFAULT_TIME_FORMAT_PATTERN規則轉換為hh:mm:ss或hh:mm格式</p> 
         * 
         * @param time 字符串格式時間 
         * @return DateTime 日期時間對象 
         */  
        public static DateTime parseTime(String time) throws java.text.ParseException {  
            try {  
                return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_FORMAT_PATTERN);  
            } catch (ParseException e) {  
                return DateTime.parseDateTime(time, DateTime.DEFAULT_TIME_HHmm_FORMAT_PATTERN);  
            }  
        }  

        /** 
         * 解析日期 <p>根據DateTime中的DEFAULT_DATE_FORMAT_PATTERN規則轉換為yyyy-MM-dd格式</p> 
         * 
         * @param date 字符串格式日期 
         * @return DateTime 日期時間類 
         */  
        public static DateTime parseDate(String date) throws java.text.ParseException {  
            return DateTime.parseDateTime(date, DateTime.DEFAULT_DATE_FORMAT_PATTERN);  
        }  

        /** 
         * 解析日期時間 <p>根據DateTime中的DEFAULT_DATE_TIME_FORMAT_PATTERN規則轉換為yyyy-MM-dd 
         * HH:mm:ss格式</p> 
         * 
         * @param datetime 字符串格式日期時間 
         * @return DateTime 日期時間對象 
         */  
        public static DateTime parseDateTime(String datetime) throws java.text.ParseException {  
            DateTime result = null;  
            //嘗試按yyyy-MM-dd HH:mm:ss分析  
            try {  
                result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN);  
            } catch (ParseException e) {  
                //解析錯誤  
                result = null;  
            }  

            //嘗試按yyyy-MM-dd HH:mm分析  
            if (null == result) {  
                try {  
                    result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HHmm_FORMAT_PATTERN);  
                } catch (ParseException e) {  
                    //解析錯誤  
                    result = null;  
                }  
            }  

            //嘗試按yyyy-MM-dd HH分析  
            if (null == result) {  
                try {  
                    result = DateTime.parseDateTime(datetime, DateTime.DEFAULT_DATE_TIME_HH_FORMAT_PATTERN);  
                } catch (ParseException e) {  
                    //解析錯誤  
                    result = null;  
                }  
            }  

            //嘗試按yyyy-MM-dd分析  
            if (null == result) {  
                try {  
                    result = DateTime.parseDate(datetime);  
                } catch (ParseException e) {  
                    //解析錯誤  
                    result = null;  
                }  
            }  

            //嘗試按時間分析  
            if (null == result) {  
                result = DateTime.parseTime(datetime);  
            }  
            return result;  
        }  

        /** 
         * 用指定的pattern分析字符串 <p>pattern的用法參見java.text.SimpleDateFormat</p> 
         * 
         * @param datetime 字符串格式日期時間 
         * @param pattern 日期解析規則 
         * @return DateTime 日期時間對象 
         * @see java.text.SimpleDateFormat 
         */  
        public static DateTime parseDateTime(String datetime, String pattern) throws java.text.ParseException {  
            SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateInstance();  
            fmt.applyPattern(pattern);  
            return new DateTime(fmt.parse(datetime));  
        }  

        /** 
         * 轉換為 DEFAULT_DATE_FORMAT_PATTERN (yyyy-MM-dd) 格式字符串 
         * 
         * @return yyyy-MM-dd格式字符串 
         */  
        public String toDateString() {  
            return toDateTimeString(DateTime.DEFAULT_DATE_FORMAT_PATTERN);  
        }  

        /** 
         * 轉換為 DEFAULT_TIME_FORMAT_PATTERN (HH:mm:ss) 格式字符串 
         * 
         * @return HH:mm:ss 格式字符串 
         */  
        public String toTimeString() {  
            return toDateTimeString(DateTime.DEFAULT_TIME_FORMAT_PATTERN);  
        }  

        /** 
         * 轉換為 DEFAULT_DATE_TIME_FORMAT_PATTERN (yyyy-MM-dd HH:mm:ss) 格式字符串 
         * 
         * @return yyyy-MM-dd HH:mm:ss 格式字符串 
         */  
        public String toDateTimeString() {  
            return toDateTimeString(DateTime.DEFAULT_DATE_TIME_FORMAT_PATTERN);  
        }  

        /** 
         * 使用日期轉換pattern <p>pattern的用法參見java.text.SimpleDateFormat</p> 
         * 
         * @param pattern 日期解析規則 
         * @return 按規則轉換后的日期時間字符串 
         */  
        public String toDateTimeString(String pattern) {  
            SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateInstance();  
            fmt.applyPattern(pattern);  
            return fmt.format(c.getTime());  
        }  

        /** 
         * 獲取DateTime所表示時間的某個度量的值 
         * 
         * @param field int 取值為:<br> DateTime.YEAR_FIELD -- 返回年份<br> 
         * DateTime.MONTH_FIELD -- 返回月份,一月份返回1,二月份返回2,依次類推<br> DateTime.DAY_FIELD -- 
         * 返回當前的天(本月中的)<br> DateTime.HOUR_FIELD -- 返回小時數(本天中的),24小時制<br> 
         * DateTime.MINUTE_FIELD -- 返回分鐘數(本小時中的)<br> DateTime.SECOND_FIELD -- 
         * 返回秒數(本分鐘中的)<br> DateTime.MILLISECOND_FIELD -- 返回毫秒數(本秒中的) 
         * @return int field對應的值 
         */  
        public int get(int field) {  
            //月份需要+1(月份從0開始)  
            if (DateTime.MONTH_FIELD == field) {  
                return c.get(field) + 1;  
            } else {  
                return c.get(field);  
            }  
        }  

        /** 
         * 返回自 1970-1-1 0:0:0 至此時間的毫秒數 
         * 
         * @return long 毫秒數 
         */  
        public long getTimeInMillis() {  
            return c.getTimeInMillis();  
        }  

        /** 
         * 設置field字段的值 
         * 
         * @param field int 取值為:<br> DateTime.YEAR_FIELD -- 年份<br> 
         * DateTime.MONTH_FIELD -- 月份,一月份從1開始<br> DateTime.DAY_FIELD -- 
         * 當前的天(本月中的)<br> DateTime.HOUR_FIELD -- 小時數(本天中的),24小時制<br> 
         * DateTime.MINUTE_FIELD -- 分鐘數(本小時中的)<br> DateTime.SECOND_FIELD -- 
         * 秒數(本分鐘中的)<br> DateTime.MILLISECOND_FIELD -- 毫秒數(本秒中的) 
         * @param value 
         */  
        public void set(int field, int value) {  
            //月份需要-1(月份從0開始)  
            if (DateTime.MONTH_FIELD == field) {  
                c.set(field, value - 1);  
            } else {  
                c.set(field, value);  
            }  
        }  

        /** 
         * 設置DateTime日期的年/月/日 
         * 
         * @param year 年 
         * @param month 月 
         * @param day 日 
         */  
        public void set(int year, int month, int day) {  
            set(DateTime.YEAR_FIELD, year);  
            set(DateTime.MONTH_FIELD, month);  
            set(DateTime.DAY_FIELD, day);  
        }  

        /** 
         * 設置DateTime日期的年/月/日/小時 
         * 
         * @param year 年 
         * @param month 月 
         * @param day 日 
         * @param hour 小時 
         */  
        public void set(int year, int month, int day, int hour) {  
            set(year, month, day);  
            set(DateTime.HOUR_FIELD, hour);  
        }  

        /** 
         * 設置DateTime日期的年/月/日/小時/分鐘 
         * 
         * @param year 年 
         * @param month 月 
         * @param day 日 
         * @param hour 小時 
         * @param minute 分鐘 
         */  
        public void set(int year, int month, int day, int hour, int minute) {  
            set(year, month, day, hour);  
            set(DateTime.MINUTE_FIELD, minute);  
        }  

        /** 
         * 設置DateTime日期的年/月/日/小時/分鐘/秒 
         * 
         * @param year 年 
         * @param month 月 
         * @param day 日 
         * @param hour 小時 
         * @param minute 分鐘 
         * @param second 秒 
         */  
        public void set(int year, int month, int day, int hour, int minute, int second) {  
            set(year, month, day, hour, minute);  
            set(DateTime.SECOND_FIELD, second);  
        }  

        /** 
         * 設置DateTime日期的年/月/日/小時/分鐘/秒/毫秒 
         * 
         * @param year 年 
         * @param month 月 
         * @param day 日 
         * @param hour 小時 
         * @param minute 分鐘 
         * @param second 秒 
         * @param milliSecond 毫秒 
         */  
        public void set(int year, int month, int day, int hour, int minute, int second, int milliSecond) {  
            set(year, month, day, hour, minute, second);  
            set(DateTime.MILLISECOND_FIELD, milliSecond);  
        }  

        /** 
         * 對field值進行相加 <p>add() 的功能非常強大,add 可以對 DateTime 的字段進行計算。<br> 
         * 如果需要減去值,那么使用負數值就可以了,如 add(field, -value)。<br> 
         * 或者調用DateTime.reduce(int,int)進行日期相減</p> 
         * 
         * @param field int 取值為:<br>   DateTime.YEAR_FIELD -- 年份<br> 
         *   DateTime.MONTH_FIELD -- 月份,一月份從1開始<br> 
         *   DateTime.DAY_FIELD -- 當前的天(本月中的)<br> 
         *   DateTime.HOUR_FIELD -- 小時數(本天中的),24小時制<br> 
         *   DateTime.MINUTE_FIELD -- 分鐘數(本小時中的)<br> 
         *   DateTime.SECOND_FIELD -- 秒數(本分鐘中的)<br> 
         *   DateTime.MILLISECOND_FIELD -- 毫秒數(本秒中的) 
         * @param amount 數量(如果數量小于0則為相減) 
         */  
        public void add(int field, int amount) {  
            c.add(field, amount);  
        }  

        /** 
         * 對field值進行相減 <p>對add() 的功能進行封裝,add 可以對 Calendar 的字段進行計算。<br> 
         * 如果需要減去值,那么使用負數值就可以了,如 add(field, -value)。<br> 
         * 詳細用法參見Calendar.add(int,int)</p> 
         * 
         * @param field int 取值為:<br>   DateTime.YEAR_FIELD -- 年份<br> 
         *   DateTime.MONTH_FIELD -- 月份,一月份從1開始<br> 
         *   DateTime.DAY_FIELD -- 當前的天(本月中的)<br> 
         *   DateTime.HOUR_FIELD -- 小時數(本天中的),24小時制<br> 
         *   DateTime.MINUTE_FIELD -- 分鐘數(本小時中的)<br> 
         *   DateTime.SECOND_FIELD -- 秒數(本分鐘中的)<br> 
         *   DateTime.MILLISECOND_FIELD -- 毫秒數(本秒中的) 
         * @param amount 數量(如果數量小于0則為相加) 
         */  
        public void reduce(int field, int amount) {  
            c.add(field, -amount);  
        }  

        /** 
         * 判斷此 DateTime 表示的時間是否在指定 Object 表示的時間之后,返回判斷結果。 <p>此方法等效于:compareTo(when) 
         * > 0<br> 當且僅當 when 是一個 DateTime 實例時才返回 true。否則該方法返回 false。 
         * 
         * @param when 要比較的 Object 
         * @return 如果此 DateTime 的時間在 when 表示的時間之后,則返回 true;否則返回 false。 
         */  
        public boolean after(Object when) {  
            if (when instanceof DateTime) {  
                return c.after(((DateTime) when).c);  
            }  
            return c.after(when);  
        }  

        /** 
         * 判斷此 DateTime 表示的時間是否在指定 Object 表示的時間之前,返回判斷結果。 <p>此方法等效于:compareTo(when) 
         * < 0<br> 當且僅當 when 是一個 DateTime 實例時才返回 true。否則該方法返回 false。</p> 
         * 
         * @param when 要比較的 Object 
         * @return 如果此 Calendar 的時間在 when 表示的時間之前,則返回 true;否則返回 false。 
         */  
        public boolean before(Object when) {  
            if (when instanceof DateTime) {  
                return c.before(((DateTime) when).c);  
            }  
            return c.before(when);  
        }  

        /** 
         * 創建并返回此對象的一個副本 
         * 
         * @return 日期時間對象 
         */  
        @Override  
        public Object clone() {  
            return new DateTime((Calendar) c.clone());  
        }  

        /** 
         * 返回該此日歷的哈希碼 
         * 
         * @return 此對象的哈希碼值。 
         * @see Object 
         */  
        @Override  
        public int hashCode() {  
            return c.hashCode();  
        }  

        /** 
         * 將此 DateTime 與指定 Object 比較。 
         * 
         * @param obj - 要與之比較的對象。 
         * @return 如果此對象等于 obj,則返回 true;否則返回 false。 
         * @see Object 
         */  
        @Override  
        public boolean equals(Object obj) {  
            if (obj instanceof DateTime) {  
                return c.equals(((DateTime) obj).toCalendar());  
            }  
            if (obj instanceof Calendar) {  
                return c.equals(obj);  
            }  
            if (obj instanceof java.util.Date) {  
                return c.getTime().equals(obj);  
            }  
            return false;  
        }  
    }  
接下來再來看看如何使用:

獲取當前系統時間:DateTime.now(); 返回的是一個DateTime對象。

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

例如:java.util.date 

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

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

  1. new DateTime("2014-10-29").toDate();  
當然也可以是這樣的
  1. new DateTime("2014-10-29 15:19:23").toDate();  
這里的只是基礎用法,還有一些情況是將java.util.Date轉換成字符串格式的

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

  1. new DateTime(new Date()).toDateString();  
返回的是 2014-10-29 這種格式的字符串
  1. new DateTime(new Date()).toDateTimeString();  
返回的是2014-10-29 15:23:23 這種格式的字符串

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

  1. new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日");  
  2. new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日 hh時mm分ss秒");  
這樣就可以了!

來自:http://blog.csdn.net/yakson/article/details/40586639

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!