Java基礎之:日期類
第一代日期類
-
Date:精確到毫秒,代表特定的瞬間
-
SimpleDateFormat:格式和解析日期的類
-
SimpleDateFormat 是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文字)、解析(文字 -> 日期)和規範化.
package class_Date; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; public class ClassTest_FirstDate { public static void main(String[] args) throws ParseException { Date d1 = new Date(); //獲取當前系統時間 Date d2 = new Date(9234567); //通過指定毫秒數得到時間 System.out.println(d1.getTime()); //獲取某個時間對應的毫秒數 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E"); String format = sdf.format(d1); // format:將日期轉換成指定格式的字串 String s = "1996年01月01日 10:20:30 星期一"; Date parse = sdf.parse(s); //parse方法會拋編譯異常 } }
日期格式化輸出的時候,使用的字母是提前規定好了的。
第二代日期類
第二代日期類,主要就是 Calendar類(日曆)。
public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>
Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。
package class_Date; import java.util.Calendar; public class ClassTest_SecondDate { public static void main(String[] args) { Calendar c = Calendar.getInstance(); // 建立日曆類物件//比較簡單,自由 //抽象類建立物件,但實際c的執行型別為其子類 GregorianCalendar System.out.println(c); System.out.println(c.getClass()); //GregorianCalendar //獲取日曆物件的某個日曆欄位 System.out.println("年:" + c.get(Calendar.YEAR)); System.out.println("月:" + (c.get(Calendar.MONTH) + 1)); System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH)); System.out.println("小時:" + c.get(Calendar.HOUR)); System.out.println("分鐘:" + c.get(Calendar.MINUTE)); System.out.println("秒:" + c.get(Calendar.SECOND)); // Calender 沒有專門的格式化方法,所以需要程式設計師自己來組合顯示 System.out.println( c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DAY_OF_MONTH) + "日"); } }
第三代日期類
前面兩代日期類的不足分析:
JDK 1.0中包含了一個java.util.Date類,但是它的大多數方法已經在JDK 1.1引入Calendar類之後被棄用了。而Calendar並不比Date好多少。它們面臨的問題是:
-
可變性:像日期和時間這樣的類應該是不可變的。
-
偏移性:Date中的年份是從1900開始的,而月份都從0開始。
-
格式化:格式化只對Date有用,Calendar則不行。
-
此外,它們也不是執行緒安全的;不能處理閏秒等(每隔2天,多出1s)。
第三代日期類簡單使用
package class_Date; import java.util.Date; import java.time.Instant; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class ClassTest_ThirdDate { public static void main(String[] args) { // 第三代日期的基本使用 LocalDateTime ldt = LocalDateTime.now(); // 日期時間物件 // LocalDate ldt = LocalDate.now();//LocalTime.now() // System.out.println(ldt); // LocalTime ldt = LocalTime.now(); // System.out.println(ldt); System.out.println(ldt.getYear()); System.out.println(ldt.getMonthValue()); System.out.println(ldt.getMonth()); System.out.println(ldt.getDayOfMonth()); System.out.println(ldt.getHour()); System.out.println(ldt.getMinute()); System.out.println(ldt.getSecond()); // 格式化 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH小時mm分鐘ss秒"); String myDate = dtf.format(ldt); System.out.println(myDate); // Instant 和 Date System.out.println("=========Instant 和 Date 相互轉換============"); Instant now = Instant.now(); System.out.println(now); Date date = Date.from(now); Instant instant = date.toInstant(); } }
第三代日期類常見方法
-
LocalDate(日期)、LocalTime(時間)、LocalDateTime(日期時間)
-
類似於Calendar
-
LocalDate只包含日期,可以獲取日期欄位
-
LocalTime只包含時間,可以獲取時間欄位
-
LocalDateTime包含日期+時間,可以獲取日期和時間欄位
-
-
Instant
-
類似於Date
-
提供了一系列和Date類轉換的方式
-
Instant——>Date:
-
Date date = Date.from(instant);
-
Date——>Instant:
-
Instant instant = date.toInstant();
-
-
DateTimeFormatter格式日期類
-
類似於SimpleDateFormat
-
DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);
-
String str = dtf.format(日期物件);
-
-
第三代日期類更多方法
-
LocalDateTime類
-
MonthDay類:檢查重複事件
-
是否是閏年
-
增加日期的某個部分
-
使用plus方法測試增加時間的某個部分
-
使用minus方法測試檢視一年前和一年後的日期
-
測試時間戳類:Instant ,相當於以前的Date
-
測試DateTimeFormatter
-
package class_Date; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.MonthDay; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Date; import org.junit.Test; public class ClassTest_AllDateMethods { public static void main(String[] args) { // TODO Auto-generated method stub // new AllDateMethods().hi(); // new AllDateMethods().hello(); } // JUnit 測試單元 // 1. 配置快捷鍵 alt + J // 2. 如果要執行某個 測試單元,就選中方法名或游標定位在方法名,在執行 Junit // 3. 如果不選,就執行,就把所有的測試單元都執行 // 4.@Test,代表此方法是測試單元,可以單獨執行測試 @Test public void hi() { System.out.println("hi "); } @Test public void hello() { System.out.println("hello"); } @Test public void testLocalDate() { // 獲取當前日期(只包含日期,不包含時間) LocalDate date = LocalDate.now(); System.out.println(date); // 獲取日期的指定部分 System.out.println("year:" + date.getYear()); System.out.println("month:" + date.getMonth()); System.out.println("day:" + date.getDayOfMonth()); System.out.println("week:" + date.getDayOfWeek()); // 根據指定的日期引數,建立LocalDate物件 LocalDate of = LocalDate.of(2010, 3, 2); System.out.println(of); } // 測試LocalTime類 @Test public void testLocalTime() { // 獲取當前時間(只包含時間,不包含日期) LocalTime time = LocalTime.now(); System.out.println(time); // 獲取時間的指定部分 System.out.println("hour:" + time.getHour()); System.out.println("minute:" + time.getMinute()); System.out.println("second:" + time.getSecond()); System.out.println("nano:" + time.getNano()); // 根據指定的時間引數,建立LocalTime物件 LocalTime of = LocalTime.of(10, 20, 55); System.out.println(of); } // 測試LocalDateTime類 @Test public void testLocalDateTime() { // 獲取當前時間(包含時間+日期) LocalDateTime time = LocalDateTime.now(); // 獲取時間的指定部分 System.out.println("year:" + time.getYear()); System.out.println("month:" + time.getMonthValue()); System.out.println("day:" + time.getMonth()); System.out.println("day:" + time.getDayOfMonth()); System.out.println("hour:" + time.getHour()); System.out.println("minute:" + time.getMinute()); System.out.println("second:" + time.getSecond()); System.out.println("nano:" + time.getNano()); // 根據指定的時間引數,建立LocalTime物件 LocalDateTime of = LocalDateTime.of(2020, 2, 2, 10, 20, 55); System.out.println(of); } @Test public void testMonthDay() { LocalDate birth = LocalDate.of(1994, 7, 14); // 生日 MonthDay birthMonthDay = MonthDay.of(birth.getMonthValue(), birth.getDayOfMonth()); LocalDate now = LocalDate.now(); // 當前日期 MonthDay current = MonthDay.from(now); if (birthMonthDay.equals(current)) { System.out.println("今天生日"); } else { System.out.println("今天不生日"); } } // 判斷是否為閏年 @Test public void testIsLeapYear() { LocalDate now = LocalDate.now(); System.out.println(now.isLeapYear()); } // 測試增加日期的某個部分 @Test public void testPlusDate() { LocalDate now = LocalDate.now(); // 日期 // 3年前 的日期 LocalDate plusYears = now.plusDays(-1); System.out.println(plusYears); } // 使用plus方法測試增加時間的某個部分 // 時間範圍判斷 @Test public void testPlusTime() { LocalTime now = LocalTime.now();// 時間 LocalTime plusHours = now.plusSeconds(-500); System.out.println(plusHours); } // 使用minus方法測試檢視一年前和一年後的日期 @Test public void testMinusTime() { LocalDate now = LocalDate.now(); LocalDate minus = now.minus(1, ChronoUnit.YEARS); // LocalDate minus2 = now.minusYears(1); System.out.println(minus); } // 測試時間戳類:Instant ,相當於以前的Date類 @Test public void testInstant() { Instant now = Instant.now(); System.out.println(now); // 與Date類的轉換 Date date = Date.from(now); System.out.println(date); Instant instant = date.toInstant(); System.out.println(instant); } // 格式轉換 @Test public void testDateTimeFormatter() { DateTimeFormatter pattern = DateTimeFormatter.ofPattern("MM-dd yyyy HH:mm:ss"); // 將字串轉換成日期 LocalDateTime parse = LocalDateTime.parse("03-03 2017 08:40:50", pattern); System.out.println(parse); // 將日期轉換成字串 //LocalDateTime parse = LocalDateTime.now(); String format = pattern.format(parse); System.out.println(format); } }