Java - 時間相關API

By sunwc 2023-03-26 Java

JDK 8 以前日期時間API

  • java.lang.System.currentTimeMillis():回傳(long值)當前時間與1970年1月1日0時0分0秒之間以毫秒為單位的時間差(時間戳)

    • UTC 統一標準時間
    • GMT 格林威治標準時間
    • CST 中央標準時間
  • java.util.Date

    • java.sql.Date
  // 1. toString():顯示當前的年、月、日、時、分、秒
  // 2. getTime():取得當前Date物件對應的毫秒數(時間戳)

  // 3.當前時間Date物件
  Date date = new Date();
  System.out.println(date.toString()); // Sun Mar 26 21:13:32 GMT+08:00 2023
  System.out.println(date.getTime()); // 1679836437117

  // 4. 指定毫秒數Date物件
  Date date2 = new Date(1679836437117L); // Sun Mar 26 21:13:57 GMT+08:00 2023

  // 5. 如何將java.sql.Date, java.util.Date 互轉
  // java.sql.Date 轉 java.util.Date(子轉父)
  Date date3 = new java.sql.Date(1679836437117L);
  System.out.println(date3.toString()); // 2023-03-26

  // java.util.Date 轉 java.sql.Date(父轉子)
  java.sql.Date date4 = new java.sql.Date(date3.getTime());
  System.out.println(date4.toString()); // 2023-03-26

  • java.text.SimpleDateFormat:對Date類的格式化和解析
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化:日期 -> 字串
System.out.println(sdf.format(new Date())); // 2023-03-26 21:46:26

// 解析:字串 -> 日期
Date parse = null;
try {
    parse = sdf.parse("2023-03-26 21:46:26"); 
} catch (ParseException e) {
    e.printStackTrace();
}
if (parse != null) {
    System.out.println(parse.toString()); // Sun Mar 26 21:46:26 GMT+08:00 2023
}

  • java.util.Calendar(抽象類)

    常用方法:

    • get()
    • set()
    • add()
    • getTime()
    • setTime()

    注意:

    • 取得月份時,一月是0、二月是1,以此類推…十二月是11
    • 取得星期時,週日是1、週一是2,以此類推…週六是7
    // Date 偏移量 YEAR從1900開始、月從0開始
    Date date = new Date(2023-1900, 3-1, 27);
    System.out.println(date);
    
// 方式一、創建其子類(GregorianCalendar)的物件
// 方式二、調用其靜態方法 getInstance()
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass()); // class java.util.GregorianCalendar

// get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); // 這個月的第幾天
System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); // 這個年的第幾天

// add()
calendar.add(Calendar.DAY_OF_YEAR, -3);
days = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println(days); // 這個年的第幾天

// getTime()
Date date = calendar.getTime();
System.out.println(date); // Mon Mar 27 09:42:12 GMT+08:00 2023

// setTime()
Date date1 = new Date();
calendar.setTime(date1);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); // 這個年的第幾天

練習

// 字串"2020-09-08" 轉換為 java.sql.Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2020-09-08");

java.sql.Date date1 = new java.sql.Date(date.getTime());
System.out.println(date1);// 2020-09-08

JDK 8 以後日期時間API

  • LocalDate
  • LocalTime
  • LocalDateTime
@Test
public void LocalDateTest() {

    // now() 取得當前日期、時間、日期+時間
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();

    // of() 設置指定的年、月、時、分、秒。沒有偏移量
    LocalDateTime localDateTime1 = localDateTime.of(2023, 3, 27, 10, 13, 0);
    System.out.println(localDateTime1);// 2023-03-27T10:13

    // getXxx() 取得相關屬性
    System.out.println(localDateTime1.getDayOfMonth());
    System.out.println(localDateTime1.getDayOfWeek());
    System.out.println(localDateTime1.getMonth());
    System.out.println(localDateTime1.getMonthValue());
    System.out.println(localDateTime1.getMinute());

    // LocalDate 不可變性
    // withXxx() 設置相關屬性
    LocalDate localDate1 = localDate.withDayOfMonth(31);
    System.out.println(localDate); // 2023-03-27
    System.out.println(localDate1); // 2023-03-31

    // LocalDateTime 不可變性
    LocalDateTime localDateTime2 = localDateTime.withHour(12);
    System.out.println(localDateTime); // 2023-03-27T10:22:58.529
    System.out.println(localDateTime2); // 2023-03-27T12:22:58.529
    
    // plusXxx()
    LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
    System.out.println(localDateTime); // 2023-03-27T10:24:37.844
    System.out.println(localDateTime3); // 2023-06-27T10:24:37.844

    // minusXxx()
    LocalDateTime localDateTime4 = localDateTime.minusDays(6);
    System.out.println(localDateTime); // 2023-03-27T10:25:47.916
    System.out.println(localDateTime4); // 2023-03-21T10:25:47.916
}

  • java.time.Instant
@Test
public void instantTest() {
    // now() 取得本初子午線對應的標準時間
    Instant now = Instant.now();
    // 考慮時區問題 UTC+8 小時
    OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime); // 2023-03-27T10:38:16.822+08:00

    // 直接指定台灣台北時區
    ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Taipei"));
    System.out.println(zonedDateTime.toLocalDateTime()); // 2023-03-27T10:43:59.249

    // toEpochMills():取得自1970年1月1日0時0分0秒(UTC)開始的毫秒數
    long milli = now.toEpochMilli();
    System.out.println(milli); // 1679885289697

    // ofEpochMilli():通過指定的毫秒數,取得Instant實例
    Instant instant = Instant.ofEpochMilli(1679885289697L);
    OffsetDateTime offsetDateTime1 = instant.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime1); // 2023-03-27T10:48:09.697+08:00

    ZonedDateTime zonedDateTime1 = instant.atZone(ZoneId.of("Asia/Taipei"));
    System.out.println(zonedDateTime1.toLocalDateTime()); // 2023-03-27T10:48:09.697
}