Java中常用的日期類圖文詳解
前言
本文將分析Java中的Date、Calendar、DateFormat、SimpleDateFormat,并熟悉及使用其中的常用方法。
閱讀本文你將了解上述的各類。并且熟練日期的常用操作,包括但不限于:日期的比較、獲取日期中的信息、日期的加減、日期指定格式化等等
Date
日期類,這個(gè)大家應(yīng)該是比較熟悉的,常用的一條語(yǔ)句是
Date date = new Date();
上述代碼,用于獲取一個(gè)當(dāng)前的時(shí)間的Date對(duì)象。但是在源碼的注釋中明確表明,其中的很多方法已被廢棄。
為什么Date的大部分方法被棄用
那么為什么廢棄呢?我們來(lái)看注釋
注釋
原注釋如下
The class Date represents a specific instant in time, with millisecond
precision.Prior to JDK 1.1, the class Date had two additional functions.
It allowed the interpretation of dates as year, month, day, hour,
minute, and second values. It also allowed the formatting and parsing of date
strings.
Unfortunately, the API for these functions was not amenable to
internationalization. As of JDK 1.1, the Calendar class should be used to
convert between dates and time fields and the DateFormat class should be used to
format and parse date strings.The corresponding methods in Date are deprecated.
翻譯
Date表示一個(gè)時(shí)間的瞬間,精確到毫秒。
在JDK1.1之前,該類有額外的兩個(gè)方法。它允許以年、月、日、小時(shí)、分和秒的值解析日期。還允許格式化和處理日期字符串。
可惜的是,這些方法的API并不適用于國(guó)際化。在JDK1.1中,Calender類應(yīng)該被用于日期和時(shí)間字段的間的轉(zhuǎn)換,DateFormat類應(yīng)該被用于格式化和處理日期字符串。
Date中相關(guān)的方法已棄用。
目前可用方法的測(cè)試示例
那么目前Date的主要作用是什么呢?我們挨個(gè)看看現(xiàn)在Date類中可用的方法。
可用方法
獲取時(shí)間
獲取日期的毫秒數(shù)(自1970年開(kāi)始)
long getTime()
日期前后的比較
boolean after(Date date) boolean befor(Date date) boolean compareTo(Date date)
設(shè)置時(shí)間
以毫秒數(shù)設(shè)置時(shí)間
void setTime(long l);
相等判斷
boolean equals(Date date)
示例
public class Test { public static void main(String[] args) throws InterruptedException { Date date = new Date(); //睡眠一毫秒 否則可能會(huì)導(dǎo)致date和date1相等 Thread.sleep(1); Date date1 = new Date(); //獲取當(dāng)前時(shí)間的毫秒數(shù) long l = date.getTime(); System.out.println(l); if(date1.after(date)) //以調(diào)用者為主 調(diào)用者是否在參數(shù)之后 System.out.println("date1在date2之后"); if(date.before(date1)) //以調(diào)用者為主 調(diào)用者是否在參數(shù)之前 System.out.println("date在date1之前"); System.out.println("默認(rèn)的輸出格式:" + date.toString()); System.out.println("與比自己大的日期比較:" + date.compareTo(date1)); System.out.println("與比自己的日期比較:" + date.compareTo(date)); System.out.println("與比自己小的日期比較:" + date1.compareTo(date)); date.setTime(l + 5000); //以長(zhǎng)整型設(shè)置新的時(shí)間 加五秒 System.out.println("五秒后的時(shí)間:" + date.toString()); //獲取一個(gè)與當(dāng)前時(shí)間相同的Instant對(duì)象 Instant instant = date.toInstant(); if(date.equals(date1)) { //這里其實(shí)比較的就是Date的毫秒數(shù) System.out.println("日期不等。"); } } }
默認(rèn)日期格式的分析
從左到右依次為:星期 月份 日 時(shí):分:秒 日期類型 年份
這里的CTS指的是北京時(shí)間
Date小結(jié)
Date類主要的作用,從上面的方法看來(lái),很明顯是用于獲取一個(gè)當(dāng)前日期的對(duì)象以及日期間簡(jiǎn)單的前后比較。
Calendar
主要用于獲取日期中的信息以及操作日期。
簡(jiǎn)單介紹
日歷類,主要用于設(shè)置和操作日期。以及獲取一些日期里的信息,比如當(dāng)前日期是星期幾,今天是今年的第多少周等等。
常用的方法
獲取實(shí)例
Calendar getInstance();
獲取日期里的信息
這個(gè)是重點(diǎn),獲取許多日期中的信息基本都依賴于這個(gè)方法。比如當(dāng)前日期是星期幾、今天是今年第幾天等。實(shí)例里會(huì)詳細(xì)說(shuō)明各個(gè)信息的獲取方式。
int get(int field)
這里再提一個(gè)方法,這個(gè)方法就是用于獲取日歷里面的日期對(duì)象的。
Date getTime()
日期的加減與滾動(dòng)
加減
加減很好理解,下面兩個(gè)字段的含義為:
field : 表示加減操作的字段。比如Calendar.Date,表示天,Calendar.YEAR,表示年,還有Calendar.MONTH等等。
amount : 操作的數(shù)目。如果是正數(shù)則表示加,反之則表示減。比如10,則表示加十次。-10則表示減十次。
void add(int field, int amount);
下面這段代碼則表示,當(dāng)前日期加十天。
calendar.add(Calendar.Date , 10);
滾動(dòng)
void roll(int field, int amount);
再說(shuō)滾動(dòng),與add不同,roll方法只操作單個(gè)字段,其字段含義與add相同。注意我的用詞,是只,不是之,不是值,更不是只因。
那什么叫只操作單個(gè)字段呢?比如當(dāng)前日期為11.1號(hào),分別調(diào)用以下方法
add(Calendar.DATE , -1);
日期減一天,此時(shí)日期為 10.31
但調(diào)用
roll(Calendar.DATE , -1);
獲取到的日期為 11.30
看出來(lái)了嗎,add方法是正常的日期加減,而roll的操作是該列滾動(dòng)操作??梢钥醋?strong>設(shè)置鬧鐘時(shí)候的那種滾動(dòng),而且他的部分子類(這取決于地區(qū))是不會(huì)有年月日的聯(lián)動(dòng)的。也就造成了上面的情況。
日期的設(shè)置
相較于Date類中只能用毫秒數(shù)設(shè)置日期,Calendar中可以以多種方式設(shè)置時(shí)間。
void setTime(Date date); void set(int year, int month, int date) void set(int year, int month, int date, int hourOfDay, int minute) void set(int year, int month, int date, int hourOfDay, int minute, int second)
還有以指定的周數(shù)及星期來(lái)設(shè)置時(shí)間等等。
setWeekDate(int weekYear, int weekOfYear, int dayOfWeek)
當(dāng)然還有一些用的其他的方法,這里就不一一列舉了。
測(cè)試實(shí)例代碼
public class CalendarTest { public static void main(String[] args) { //根據(jù)地區(qū)獲取對(duì)應(yīng)的Calender-日歷 默認(rèn)為當(dāng)前時(shí)間,值得注意的是這里的獲取實(shí)例 // 用的很明顯的提供者模式 Calendar calendar = Calendar.getInstance(); //get方法的返回值為int 不同的參數(shù)對(duì)應(yīng)不同的值 System.out.println("年:" + calendar.get(Calendar.YEAR)); System.out.println("月:" + calendar.get(Calendar.MONTH)); System.out.println("日:" + calendar.get(Calendar.DATE)); System.out.println("時(shí)(12小時(shí)制):" + calendar.get(Calendar.HOUR)); System.out.println("時(shí)(24小時(shí)制):" + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("分:" + calendar.get(Calendar.MINUTE)); System.out.println("秒:" + calendar.get(Calendar.SECOND)); // 日期與天 // 這里需要注意的是星期里面 周日的為1 周一為2 周二為3 以此類推 所以這里要減一 System.out.println("今天是這周第幾天:" + (calendar.get(Calendar.DAY_OF_WEEK) - 1)); System.out.println("今天是這個(gè)月第幾天:" + calendar.get(Calendar.DAY_OF_MONTH)); System.out.println("今天是今年第幾天::" + calendar.get(Calendar.DAY_OF_YEAR)); //日期與周 System.out.println("現(xiàn)在是這月第幾周:" + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("現(xiàn)在是今年第幾周:" + calendar.get(Calendar.WEEK_OF_YEAR)); //表示當(dāng)前時(shí)間是在上午還是在下午 0 - 上午(午夜到正午) 1-下午 System.out.println("上午:" + calendar.get(Calendar.AM_PM)); System.out.println("===================日期的設(shè)置======================="); //設(shè)置日期為2022年1月1號(hào) 精確到天 calendar.set(2022 , Calendar.JANUARY , 1); //設(shè)置為 2022-2-1 10:12 精確到分 calendar.set(2022 , Calendar.FEBRUARY , 1 , 10 , 12); //設(shè)置為 2022-3-1 10:12:1 日期 精確到秒 calendar.set(2022 , Calendar.MAY , 1 , 10, 10,1); System.out.println("設(shè)置后的時(shí)間:" + calendar.getTime().toString()); calendar.clear(); //還可以指定年、周數(shù)來(lái)設(shè)置日期為 這里是設(shè)置日期為 2022年的第1周的周三 calendar.setWeekDate(2022 , 1, Calendar.WEDNESDAY); //這里需要注意 如果2022.1.1號(hào)是周六 那么之前周一到周五也算第一周 即使它們?cè)?021年里 //這也就解釋了為什么2022年第一周周三的日期為2021-12-29 System.out.println("2022年的第1周的周三: " + calendar.getTime().toString()); System.out.println("===================日期的改變======================="); //日期的改變 calendar.clear();//設(shè)置時(shí)間為2022-11-1 calendar.set(2022 , Calendar.NOVEMBER , 1); System.out.println("當(dāng)前時(shí)間:" + calendar.getTime().toString()); //日期的滾動(dòng) 只操作單列而不影響其他的信息 calendar.roll(Calendar.DATE , -1);//正數(shù)為向上滾(+) 負(fù)數(shù)為向下滾(-) System.out.println("向下滾動(dòng)一天的時(shí)間(11-30):" + calendar.getTime().toString()); //日期的加減 前一個(gè)參數(shù)為操作的類型 后一個(gè)參數(shù)為改變的數(shù)量 calendar.clear();//設(shè)置時(shí)間為2022-11-1 calendar.set(2022 , Calendar.NOVEMBER , 1); calendar.add(Calendar.DATE , -1); System.out.println("當(dāng)前時(shí)間減去一天為(10-31):" + calendar.getTime().toString()); //加一天 calendar.add(Calendar.DATE , 1); System.out.println("再減一天為:" + calendar.getTime().toString()); System.out.println("===================一些信息的設(shè)置======================="); //獲取字段對(duì)應(yīng)最大的值 System.out.println("一年中天數(shù)最大可能為:" + calendar.getMaximum(Calendar.DAY_OF_YEAR)); System.out.println("星期最大為:" + calendar.getMaximum(Calendar.DAY_OF_WEEK)); System.out.println("一月天數(shù)最大為:" + calendar.getMaximum(Calendar.DAY_OF_MONTH)); } }
DateFormat與SimpleDateFormat
DateFormat
是一個(gè)抽象類,其實(shí)這個(gè)類有點(diǎn)雞肋,你別看名字叫做日期格式化。但其實(shí)它只能轉(zhuǎn)換和處理固定的格式日期。跳過(guò)不看也是可以的。
值得注意的是,該類的屬性種包含一個(gè)Calendar。我們后面講到的SimpleDateFormat是DateFormat的子類,所以需要注意一下。
比如將一個(gè)Date轉(zhuǎn)換為String,或者String轉(zhuǎn)換為Date。固定格式為:xx-xx-xx。比如2022-11-1。
常用方法
這里來(lái)認(rèn)識(shí)兩個(gè)種方法:日期轉(zhuǎn)字符的format以及與之相反的parse
日期轉(zhuǎn)字符
這其中fieldPosition參數(shù)的我會(huì)在測(cè)試示例里具體說(shuō)明
StringBuffer format(Date date, StringBuffer toAppendTo,FieldPosition fieldPosition); String format(Date date);
字符轉(zhuǎn)日期
這其中pos參數(shù)的我會(huì)在測(cè)試示例里具體說(shuō)明
Date parse(String source); Date parse(String source, ParsePosition pos);
測(cè)試實(shí)例
public class DateFormatTest { public static void main(String[] args) throws ParseException { Date date = new Date(); //獲取一個(gè)實(shí)例 跟Calendar一樣使用的是提供者模式 DateFormat dateFormat = DateFormat.getDateInstance(); System.out.println("處理字符轉(zhuǎn)為日期1:" + dateFormat.parse("2022-10-1").toString()); //將字符串處理為日期 只支持 xx-xx-xx 這種格式 且無(wú)法精確到時(shí)分秒 ParsePosition pos = new ParsePosition(1);//從第1位 0開(kāi)始將字符轉(zhuǎn)換為日期 System.out.println("處理字符轉(zhuǎn)為日期2:" + dateFormat.parse("2022-10-11", pos).toString()); //格式化日期1 默認(rèn)格式為 2022-11-3 這種 System.out.println(dateFormat.format(date)); //格式化日期2 StringBuffer stringBuffer = new StringBuffer(); //參數(shù)分別為 日期、用于輸出的StringBuffer、指定的跟蹤字段 // 跟蹤字段 - MONTH_FIELD 指向的是月份的位置 FieldPosition fieldPosition = new FieldPosition(DateFormat.MONTH_FIELD); dateFormat.format(date , stringBuffer , fieldPosition); System.out.println("日期轉(zhuǎn)為字符: :" + stringBuffer); //獲取指定字段的索引信息 int begin = fieldPosition.getBeginIndex(); int end = fieldPosition.getEndIndex(); System.out.println("指定字段在StringBuffer中的開(kāi)始索引:" + begin); System.out.println("指定字段在StringBuffer中結(jié)束索引:" + end); String fieldValue = ""; for(int i = begin; i < end; i++) { fieldValue = fieldValue + stringBuffer.charAt(i); } System.out.println("指定字段(月份)的值為:" + fieldValue); } }
SimpleDateFormat
該類是DateFormat的子類。主要用于日期的處理和格式化。相較于它的父類,它的功能更多,也更加便捷,更符合用戶的使用習(xí)慣。
主要方法
獲取實(shí)例
相較于抽象類(Calendar、DateFormat)使用的提供者模式獲取實(shí)例,現(xiàn)在我們可以直接new一個(gè)對(duì)象了。該類主要就是這一步。
SimpleDateFormat();//默認(rèn)格式為22-11-4 上午10:36 SimpleDateFormat(String pattern);//指定格式 SimpleDateFormat(String pattern, Locale locale);//指定格式 指定地區(qū) SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)//指定地區(qū)、指定日期符號(hào)
這里的格式我要強(qiáng)調(diào)一下,各字母代表的含義如下
(注意以下數(shù)據(jù)的轉(zhuǎn)換跟地區(qū)有關(guān)-Local類,不同的地區(qū)顯示不同,比如我們顯示MM顯示為11,但其他地區(qū)可能是Nov來(lái)表示月份)
字母 | 值 | 說(shuō)明 |
---|---|---|
y | 年份 | yyyy表示四位數(shù)年份,如2022 |
M | 月份 | MM表示當(dāng)前月,如11 |
m | 分鐘 | mm表示分鐘,如10 |
d | 本月天數(shù) | dd表示本月天數(shù),如04 |
D | 今年天數(shù) | D表示今年天數(shù),如185 |
E | 星期 | E表示星期,如星期三 |
h | 12小時(shí)制 | hh表示小時(shí)(0-12),如10 |
H | 24小時(shí)制 | HH表示小時(shí)(0-24),如18 |
s | 秒 | ss表示兩位秒數(shù),如02 |
S | 毫秒 | SSS表示三位毫秒數(shù),588 |
a | 時(shí)段 | a表示上午或者下午,如上午 |
當(dāng)然還有一部分字母,如:L、k、z、x、F、U等等用的比較少的就不再列舉了,有興趣自行了解。
常用的格式
下面我會(huì)列舉一下比較常用的格式。
不帶毫秒格式
yyyy-MM-dd HH:mm:ss
2022-11-04 10:07:26
帶毫秒的
yyyy-MM-dd HH:mm:ss.SSS
2022-11-04 10:07:26.729
帶年月日
yyyy年MM月dd日 HH:mm:ss
2022年11月04日 10:20:32
帶年月日 星期 上午
yyyy年MM月dd日 E a HH:mm:ss
2022年11月04日 星期五 上午 10:20:32
橫杠帶星期
yyyy-MM-dd E HH:mm:ss
2022-11-04 星期五 10:11:10
橫杠帶 星期 時(shí)段
yyyy-MM-dd E a HH:mm:ss
2022-11-04 星期五 上午 10:17:02
無(wú)分隔符 精確到秒 一般用于作為生成文件的文件名稱
yyyyMMddHHmmss
20221104101110
精確到毫秒
yyyyMMddHHmmssSSS
20221104101110136
左斜杠格式
yyyy/MM/dd HH:mm:ss
2022/11/04 10:11:10
左斜杠帶毫秒
yyyy/MM/dd HH:mm:ss.SSS
2022/11/04 10:11:10.136
左斜杠帶星期
yyyy/MM/dd E HH:mm:ss
2022/11/04 星期五 10:11:10
日期轉(zhuǎn)為字符串
照樣來(lái)看,日志轉(zhuǎn)為字符的format(格式化)方法
String format(Date date); StringBuffer format(Date date, StringBuffer toAppendTo ,Position pos);//參考DateFormat StringBuffer format(Date date, StringBuffer toAppendTo, FieldDelegate delegate);//跟上面的差不多只是做了一個(gè)字段替換 void subFormat(int patternCharIndex, int count, FieldDelegate delegate, StringBuffer buffer, boolean useDateFormatSymbols)//真正的格式化日期方法
其實(shí)實(shí)際應(yīng)用中,我們基本只會(huì)用到第一個(gè)方法。
字符串轉(zhuǎn)日期
同上 基本只用一個(gè)parse方法
Date parse(String source) throws ParseException;
測(cè)試示例
public class SimpleDateFormatTest { public static void main(String[] args) throws ParseException { Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(); System.out.println("默認(rèn)格式化日期:" + simpleDateFormat.format(date)); //自己設(shè)置的格式 simpleDateFormat.applyPattern("yyyy-MM-dd hh:mm:ss.SSS"); System.out.println("自己設(shè)置的格式:" + simpleDateFormat.format(date)); Date date1 = simpleDateFormat.parse("2022-11-03 10:49:06.973"); System.out.println("指定字符串轉(zhuǎn)為日期對(duì)象:" + date1.toString()); System.out.println("===================================="); simpleDateFormat.applyPattern("yyyy-MM-dd HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy-MM-dd HH:mm:ss.SSS"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyyMMddHHmmss"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyyMMddHHmmssSSS"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy/MM/dd HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy/MM/dd HH:mm:ss.SSS"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy/MM/dd E HH:mm:ss.SSS"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy-MM-dd E HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy-MM-dd E a HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy年MM月dd日 HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); simpleDateFormat.applyPattern("yyyy年MM月dd日 E a HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); } }
編寫一個(gè)簡(jiǎn)單的日期工具類
工具類
package com.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author 三文魚(yú)先生 * @title * @description * @date 2022/11/4 **/ public class DateUtil { //常用的日期格式 //這里可以考慮用一個(gè)List把單元字符組合起來(lái) 用的時(shí)候再去拼接 public static final String SecondPattern = "yyyy-MM-dd HH:mm:ss"; public static final String yyyyMMddHHmmss = "yyyyMMddHHmmss"; public static final String MillisecondPattern = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String yyyyMMddHHmmssSSS = "yyyyMMddHHmmssSSS"; public static final String WeekSecond = "yyyy-MM-dd E HH:mm:ss"; public static final String WeekIntervalSecond = "yyyy-MM-dd E a HH:mm:ss"; public static final String YMDChinese = "yyyy年MM月dd日 HH:mm:ss"; public static final String SlashSecond = "yyyy/MM/dd HH:mm:ss"; public static final String SlashWeekSecond = "yyyy/MM/dd E HH:mm:ss"; public static final String SlashWeekIntervalSecond = "yyyy/MM/dd E a HH:mm:ss"; //只用于獲取星期 public static final String[] weeks = {"星期天","星期一","星期二","星期三","星期四","星期五","星期六"}; //主要的格式化功能類 private static final SimpleDateFormat format = new SimpleDateFormat(SecondPattern); //主要的日期操作類 private static Calendar calendar = null; /** * @description 根據(jù)日期獲取指定天數(shù)前的日期 * @author 三文魚(yú)先生 * @date 17:07 2022/11/4 * @param date 日期 * @param amount 天數(shù) 正數(shù)為加 負(fù)數(shù)未減 * @return java.util.Date **/ public static Date getDateWithDay(Date date , int amount) { return operateDate(date , Calendar.DATE , amount); } /** * @description 獲取七天前的時(shí)間 * @author 三文魚(yú)先生 * @date 17:08 2022/11/4 * @param date 日期 * @return java.util.Date **/ public static Date getDateWithSevenDays(Date date) { return operateDate(date , Calendar.DATE , -6); } /** * @description 以指定參數(shù)操作當(dāng)前時(shí)間 可以加減 * @author 三文魚(yú)先生 * @date 17:09 2022/11/4 * @param date 操作的日期 * @param field 操作的時(shí)間字段 比如Calendar.DATE、Calendar.YEAR等 * @param amount 操作的數(shù)量 正數(shù)為加 負(fù)數(shù)未減 * @return java.util.Date **/ public static Date operateDate(Date date ,int field , int amount) { if(calendar == null) calendar = format.getCalendar(); else calendar.clear(); calendar.setTime(date); calendar.add(field , amount); return calendar.getTime(); } /** * @description 根據(jù)指定的格式從字符串種獲取日期 再進(jìn)行操作 * @author 三文魚(yú)先生 * @date 17:11 2022/11/4 * @param str 日期字符串 * @param pattern 字符串格式 * @param field 操作的字段 比如Calendar.DATE、Calendar.YEAR等 * @param amount 操作的數(shù)量 * @return java.util.Date **/ public static Date operateDateWithString(String str , String pattern, int field , int amount) { if(calendar == null) calendar = format.getCalendar(); else calendar.clear(); calendar.setTime(parseStr(str , pattern)); calendar.add(field , amount); return calendar.getTime(); } /** * @description 獲取日期中的星期 * @author 三文魚(yú)先生 * @date 17:13 2022/11/4 * @param date 日期 * @return java.lang.String **/ public static String getWeekFromDate(Date date) { if(calendar == null) calendar = format.getCalendar(); else calendar.clear(); calendar.setTime(date); return weeks[calendar.get(Calendar.DAY_OF_WEEK) - 1]; } /** * @description 以默認(rèn)的格式將日期轉(zhuǎn)為字符串 * @author 三文魚(yú)先生 * @date 17:13 2022/11/4 * @param date 日期 * @return java.lang.String **/ public static String formatStr(Date date) { return format.format(date); } /** * @description 以指定的日期和格式 獲取字符串 * @author 三文魚(yú)先生 * @date 17:14 2022/11/4 * @param date 日期 * @param pattern 日期格式 * @return java.lang.String **/ public static String formatStr(Date date, String pattern) { if(!pattern.equals(format.toPattern())) { format.applyPattern(pattern); } return format.format(date); } /** * @description 以默認(rèn)的格式接受字符串 轉(zhuǎn)為日期 * @author 三文魚(yú)先生 * @date 17:15 2022/11/4 * @param str 日期字符串 * @return java.util.Date **/ public static Date parseStr(String str) { return parseStr(str , SecondPattern); } /** * @description 以指定的格式從字符串里獲取日期 * @author 三文魚(yú)先生 * @date 17:15 2022/11/4 * @param str 日期字符串 * @param pattern 日期格式 * @return java.util.Date **/ public static Date parseStr(String str, String pattern) { if(!pattern.equals(format.toPattern())) { format.applyPattern(pattern); } Date date = null; try { date = format.parse(str); } catch (ParseException parseException) { parseException.printStackTrace(); } return date; } }
測(cè)試示例
package com.date; import java.util.Calendar; import java.util.Date; /** * @author 三文魚(yú)先生 * @title * @description * @date 2022/11/4 **/ public class UtilTest { public static void main(String[] args) { System.out.println("以默認(rèn)格式獲取當(dāng)前時(shí)間字符串:" + DateUtil.formatStr(new Date())); System.out.println("以指定格式獲取當(dāng)前時(shí)間字符串:" + DateUtil.formatStr(new Date() , DateUtil.WeekSecond)); //以指定格式從字符中獲取日期對(duì)象 自行選擇要用的數(shù)據(jù) Date date1 = DateUtil.parseStr("2022-11-04 16:28:07"); System.out.println("以默認(rèn)格式從字符串中獲取的日期對(duì)象:" + DateUtil.formatStr(date1)); Date date2 = DateUtil.parseStr("2022年11月04日 16:28:07" , DateUtil.YMDChinese); System.out.println("以指定格式從字符串中獲取的日期對(duì)象:" + DateUtil.formatStr(date2 , DateUtil.YMDChinese)); System.out.println("獲取日期中的星期 今天是:" + DateUtil.getWeekFromDate(new Date())); //日期的加減 System.out.println("================日期的加減===================="); Date date4 = new Date(); System.out.println("現(xiàn)在的日期是:" + DateUtil.formatStr(date4 , DateUtil.WeekSecond)); Date date3 = DateUtil.getDateWithDay(date4, -1); System.out.println("昨天的日期為:" + DateUtil.formatStr(date3 , DateUtil.WeekSecond)); System.out.println("一周前的日期為:" + DateUtil.formatStr(DateUtil.getDateWithSevenDays(date4) , DateUtil.WeekSecond)); System.out.println("去年今天的日期為:" + DateUtil.formatStr(DateUtil.operateDate(date4 , Calendar.YEAR , -1))); Date date5 = DateUtil.operateDateWithString("2022-11-04 16:28:07" , DateUtil.SecondPattern , Calendar.DATE , -1); System.out.println("以字符串形式操作日期減去一天:" + DateUtil.formatStr(date5 , DateUtil.SecondPattern)); } }
總結(jié)
就是理一下Date、Calendar、DateFormat三者之間的關(guān)系。
到此這篇關(guān)于Java中常用的日期類的文章就介紹到這了,更多相關(guān)Java常用日期類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09基于Graphics2D drawImage圖片失真的解決方案
這篇文章主要介紹了基于Graphics2D drawImage圖片失真的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java實(shí)現(xiàn)求二叉樹(shù)的深度和寬度
這篇文章主要介紹了Java實(shí)現(xiàn)求二叉樹(shù)的深度和寬度,本文分別給出代碼實(shí)例,需要的朋友可以參考下2015-06-06springBoot整合shiro如何解決讀取不到@value值問(wèn)題
這篇文章主要介紹了springBoot整合shiro如何解決讀取不到@value值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-08-08Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼
這篇文章主要介紹了Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08JAVA實(shí)戰(zhàn)項(xiàng)目實(shí)現(xiàn)客戶選購(gòu)系統(tǒng)詳細(xì)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的客戶選購(gòu)系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-10-10解決@FeignClient注入service失敗問(wèn)題
這篇文章主要介紹了解決@FeignClient注入service失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringMVC配置javaConfig及StringHttpMessageConverter示例
這篇文章主要介紹了SpringMVC配置javaConfig及StringHttpMessageConverter實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07