Java中日期與時(shí)間的處理及工具類封裝詳解
在我們項(xiàng)目開發(fā)中免不了有對(duì)日期時(shí)間的處理,但Java中關(guān)于日期時(shí)間的類太多了,這篇文章主要給大家介紹一下各種類的使用及我們項(xiàng)目中應(yīng)該怎么選擇,最后做一個(gè)工具類的封裝。
一、Date、Calendar(老版日期時(shí)間類)
這是最原始的java
中關(guān)于日期時(shí)間處理的類
1. Date 的基本用法
import java.util.Date; public class TestDate { public static void main(String[] args) { // 獲取當(dāng)前時(shí)間 Date date = new Date(); // 年份 System.out.println(date.getYear() + 1900); // 月份 System.out.println(date.getMonth() + 1); // 日期 System.out.println(date.getDate()); // 轉(zhuǎn)換為本地時(shí)間 System.out.println(date.toLocaleString()); // 轉(zhuǎn)換為 GMT 時(shí)區(qū) System.out.println(date.toGMTString()); // 通過當(dāng)前系統(tǒng)時(shí)間戳初始化Date Date date1 = new Date(System.currentTimeMillis()); System.out.println(date1); } }
可以看到,我們?cè)讷@取Date
對(duì)象的年和月時(shí)都還需要進(jìn)行額外的相加操作,非常不方便,而且Date
類內(nèi)部,對(duì)于大多數(shù)方法也已經(jīng)廢棄。
2. Calendar 的基本用法
Calendar
相比于Date
多了可以對(duì)時(shí)間運(yùn)算的功能,也可以通過getTime
方法把Calendar
轉(zhuǎn)化為Date
。
import java.util.Calendar; import java.util.Date; public class TestDate { public static void main(String[] args) { // 獲取Calendar實(shí)例 Calendar cal = Calendar.getInstance(); // 獲取年、月、日、時(shí)、分、秒 System.out.println(cal.get(Calendar.YEAR)); System.out.println(cal.get(Calendar.MONTH)); System.out.println(cal.get(Calendar.DAY_OF_MONTH)); System.out.println(cal.get(Calendar.HOUR_OF_DAY)); System.out.println(cal.get(Calendar.MINUTE)); System.out.println(cal.get(Calendar.SECOND)); // 把Calendar轉(zhuǎn)化為Date Date date = cal.getTime(); } }
3. Date的格式化,DateFormat 及 SimpleDateFormat
1. DateFormat的使用
Date date = new Date(); // 處理日期轉(zhuǎn)換 DateFormat dateFormat = DateFormat.getDateInstance(); System.out.println(dateFormat.format(date)); // 處理時(shí)間轉(zhuǎn)換 DateFormat timeFormat = DateFormat.getTimeInstance(); System.out.println(timeFormat.format(date)); // 處理日期時(shí)間轉(zhuǎn)換 DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(); System.out.println(dateTimeFormat.format(date));
DateFormat
只可以處理固定的三種格式轉(zhuǎn)換,一般我們是使用它的一個(gè)實(shí)現(xiàn)類SimpleDateFormat
。
2. SimpleDateFormat的使用
SimpleDateFormat
可以格式化為自己想要的日期時(shí)間格式,也是平常使用較多的格式化類,具體使用如下
import java.text.SimpleDateFormat; import java.util.Date; public class TestDate { public static void main(String[] args) { Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH小時(shí)mm分鐘ss秒"); System.out.println(dateFormat.format(date)); } }
二、LocalDateTime(Java8新版日期時(shí)間類)
1. 基本用法
import java.time.LocalDateTime; public class App { public static void main(String[] args) { // 獲取日期時(shí)間 LocalDateTime dateTime = LocalDateTime.now(); System.out.println(dateTime); // 獲取年、月、日、時(shí)、分、秒 System.out.println(dateTime.getYear()); System.out.println(dateTime.getMonthValue()); System.out.println(dateTime.getDayOfMonth()); System.out.println(dateTime.getHour()); System.out.println(dateTime.getMinute()); System.out.println(dateTime.getSecond()); // 自定義日期時(shí)間 LocalDateTime myDateTime = LocalDateTime.of(2023, 5, 1, 0, 0, 0); System.out.println(myDateTime); } }
除了LocalDateTime
,還有LocalDate
和LocalTime
可以初始化單獨(dú)的日期和時(shí)間。
2. LocalDateTime 格式化
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class App { public static void main(String[] args) { // 獲取日期時(shí)間 LocalDateTime dateTime = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH小時(shí)mm分ss秒"); System.out.println(dateTimeFormatter.format(dateTime)); } }
LocalDateTime
是目前比較推薦使用的日期時(shí)間類。
三、日期時(shí)間工具類
一般我們項(xiàng)目中使用還有封裝一個(gè)工具類,更方便我們的使用,這里我封裝了一個(gè),供大家參考使用
import org.apache.commons.lang3.time.DateFormatUtils; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.util.Date; /** * 時(shí)間工具類 */ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY = "yyyy"; public static String YYYY_MM = "yyyy-MM"; public static String YYYY_MM_DD = "yyyy-MM-dd"; public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; /** * 獲取當(dāng)前Date型日期 * * @return Date() 當(dāng)前日期 */ public static Date getNowDate() { return new Date(); } /** * 獲取當(dāng)前日期, 默認(rèn)格式為yyyy-MM-dd * * @return String */ public static String getDate() { return dateTimeNow(YYYY_MM_DD); } public static final String getTime() { return dateTimeNow(YYYY_MM_DD_HH_MM_SS); } public static final String dateTimeNow() { return dateTimeNow(YYYYMMDDHHMMSS); } public static final String dateTimeNow(final String format) { return parseDateToStr(format, new Date()); } public static final String dateTime(final Date date) { return parseDateToStr(YYYY_MM_DD, date); } public static final String parseDateToStr(final String format, final Date date) { return new SimpleDateFormat(format).format(date); } public static final Date dateTime(final String format, final String ts) { try { return new SimpleDateFormat(format).parse(ts); } catch (ParseException e) { throw new RuntimeException(e); } } /** * 日期路徑 即年/月/日 如2018/08/08 */ public static final String datePath() { Date now = new Date(); return DateFormatUtils.format(now, "yyyy/MM/dd"); } /** * 日期路徑 即年/月/日 如20180808 */ public static final String dateTime() { Date now = new Date(); return DateFormatUtils.format(now, "yyyyMMdd"); } /** * 日期型字符串轉(zhuǎn)化為日期 格式 */ public static Date parseDate(Object str) { if (str == null) { return null; } try { return parseDate(str.toString(), parsePatterns); } catch (ParseException e) { return null; } } /** * 獲取服務(wù)器啟動(dòng)時(shí)間 */ public static Date getServerStartDate() { long time = ManagementFactory.getRuntimeMXBean().getStartTime(); return new Date(time); } /** * 計(jì)算時(shí)間差 * * @param endDate 最后時(shí)間 * @param startTime 開始時(shí)間 * @return 時(shí)間差(天/小時(shí)/分鐘) */ public static String timeDistance(Date endDate, Date startTime) { long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; // long ns = 1000; // 獲得兩個(gè)時(shí)間的毫秒時(shí)間差異 long diff = endDate.getTime() - startTime.getTime(); // 計(jì)算差多少天 long day = diff / nd; // 計(jì)算差多少小時(shí) long hour = diff % nd / nh; // 計(jì)算差多少分鐘 long min = diff % nd % nh / nm; // 計(jì)算差多少秒//輸出結(jié)果 // long sec = diff % nd % nh % nm / ns; return day + "天" + hour + "小時(shí)" + min + "分鐘"; } /** * 增加 LocalDateTime ==> Date */ public static Date toDate(LocalDateTime temporalAccessor) { ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } /** * 增加 LocalDate ==> Date */ public static Date toDate(LocalDate temporalAccessor) { LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } }
到此這篇關(guān)于Java中日期與時(shí)間的處理及工具類封裝詳解的文章就介紹到這了,更多相關(guān)Java日期時(shí)間處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)編程專題(十一)----(JUC原子類)數(shù)組類型詳解
這篇文章主要介紹了JAVA JUC原子類 數(shù)組類型詳解的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07spring boot實(shí)現(xiàn)驗(yàn)證碼功能
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了spring boot實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友可以參考下2018-04-04基于Java8 Stream API實(shí)現(xiàn)數(shù)據(jù)抽取收集
這篇文章主要介紹了基于Java8 Stream API實(shí)現(xiàn)數(shù)據(jù)抽取收集,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03一文詳解如何通過Java實(shí)現(xiàn)SSL交互功能
這篇文章主要為大家詳細(xì)介紹了如何通過Java實(shí)現(xiàn)SSL交互功能,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下2023-04-04SpringBoot實(shí)現(xiàn)模塊日志入庫的項(xiàng)目實(shí)踐
本文主要介紹了SpringBoot實(shí)現(xiàn)模塊日志入庫的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04ThreadLocal內(nèi)存泄露的產(chǎn)生原因和處理方法
ThreadLocal 的內(nèi)存泄漏問題通常發(fā)生在使用 ThreadLocal 存儲(chǔ)對(duì)象時(shí),尤其是在多線程環(huán)境中,線程池中的線程復(fù)用可能導(dǎo)致一些資源沒有及時(shí)清理,從而引發(fā)內(nèi)存泄漏,所以本文給大家介紹了ThreadLocal內(nèi)存泄露的產(chǎn)生原因和處理方法,需要的朋友可以參考下2024-12-12Java Web使用POI導(dǎo)出Excel的方法詳解
這篇文章主要介紹了Java Web使用POI導(dǎo)出Excel的方法,結(jié)合實(shí)例形式詳細(xì)分析了Java Web使用POI導(dǎo)出Excel的具體操作步驟、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-06-06