為大家提供一個好的時間工具類DateTime
阿新 • • 發佈:2019-02-05
此類的靈感來源於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
DateTime.now().toDate();
大家可能也覺得這個寫法還沒有直接new Date();來得快對不對。
那麼有很多情況是一個字串,需要轉換成java.util.Date物件,我們該怎麼做呢?
<pre name="code" class="java">new DateTime("2014-10-29").toDate();
當然也可以是這樣的
這裡的只是基礎用法,還有一些情況是將java.util.Date轉換成字串格式的new DateTime("2014-10-29 15:19:23").toDate();
可能大家一般會用SimpleDateFormat,但是這個太費事了,我們看看簡單的辦法。
new DateTime(new Date()).toDateString();
返回的是 2014-10-29 這種格式的字串
new DateTime(new Date()).toDateTimeString();
返回的是2014-10-29 15:23:23 這種格式的字串
如果我們需要類似 2014年10月29日 或 2014年10月29日 15時23分34秒 這種格式的怎麼辦呢
這樣就可以了!new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日"); new DateTime(new Date()).toDateTimeString("yyyy年MM月dd日 hh時mm分ss秒");
還有很多其他的函式,我這裡就不一一舉例了,如果大家覺得還不錯,就也請大家支援一下,留個評論,或轉介紹給其他好友,讓更多人知道。
我寫文章的動力,來源於你們的支援,你們的訪問量!
感謝大家看完本文,謝謝!