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);
}
}
