1. 程式人生 > 實用技巧 >Java基礎之:日期類

Java基礎之:日期類

Java基礎之:日期類

第一代日期類

  1. Date:精確到毫秒,代表特定的瞬間

  2. SimpleDateFormat:格式和解析日期的類

  3. 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好多少。它們面臨的問題是:

  1. 可變性:像日期和時間這樣的類應該是不可變的。

  2. 偏移性:Date中的年份是從1900開始的,而月份都從0開始。

  3. 格式化:格式化只對Date有用,Calendar則不行。

  4. 此外,它們也不是執行緒安全的;不能處理閏秒等(每隔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();
​
    }
​
}

第三代日期類常見方法

  1. LocalDate(日期)、LocalTime(時間)、LocalDateTime(日期時間)

    • 類似於Calendar

    • LocalDate只包含日期,可以獲取日期欄位

    • LocalTime只包含時間,可以獲取時間欄位

    • LocalDateTime包含日期+時間,可以獲取日期和時間欄位

  2. Instant

    • 類似於Date

    • 提供了一系列和Date類轉換的方式

    • Instant——>Date:

    • Date date = Date.from(instant);

    • Date——>Instant:

    • Instant instant = date.toInstant();

  3. DateTimeFormatter格式日期類

    • 類似於SimpleDateFormat

    • DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);

    • String str = dtf.format(日期物件);

  4. 第三代日期類更多方法

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