Java 日期時間使用總結


Java 中有關日期時間的操作,其實非常簡單,沒什么好介紹的。之所以編寫簡單知識點的博客,主要還是因為最近比較忙碌。但是不管多么忙碌,自己還是想擠出時間,保持編寫技術博客的習慣。畢竟編寫博客,不僅僅是為了總結,向別人分享技術,更重要的是鍛煉自己的思考沉淀能力,以及寫作表達能力。下面我就快速簡單的介紹一下 Java 中的日期時間操作類吧。


一、傳統的日期時間類

傳統的日期時間操作類,主要有兩個:Date 類和 SimpleDateFormat 類。

Date 類代碼示例:

import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {

        //使用空參構造 Date 對象,打印出的時間就是本機系統當前時間
        Date date1 = new Date();
        System.out.println(date1);

        /*
        使用有參構造 Date 對象,參數傳遞的是從計算機原點時間起的毫秒值
        在零時區,計算機原點時間是 1970 年 1 月 1 日 0 點整
        因為中國在東八區,所以對於中國而言,計算機原點時間是  1970 年 1 月 1 日 8 點整。
        傳遞 0 毫秒,表示獲取計算機原點時間
        */
        Date date2 = new Date(0L);
        //打印出來的是 Thu Jan 01 08:00:00 CST 1970
        //也就是1970年1月1日8點,主要是因為中國是東八區,因此需要加8個小時
        System.out.println(date2);

        Date date3 = new Date();
        //通過 Date 對象的 getTime 可以獲取到從計算機原點時間累計到現在的毫秒值
        long time1 = date3.getTime();
        System.out.println(time1);

        //Java也提供了一個快捷方法,獲取到從計算機原點時間累計到現在的毫秒值
        long time2 = System.currentTimeMillis();
        //打印出來的 time2 和 time1 的值是相同的
        System.out.println(time2); 

        Date date4 = new Date();
        //通過 setTime 傳入從計算機原點起累計的毫秒值,可以設置出新的時間
        date4.setTime(0L);
        System.out.println(date4); //此時打印出的是計算機原點時間
    }
}

SimpleDateFormat 類的代碼演示:
import java.text.SimpleDateFormat;
import java.util.Date;

/*
SimpleDateFormat 主要是為了將 Date 對象格式化為自定義的日期時間字符串
也可以將指定格式的日期格式字符串,解析為 Date 對象
*/
public class DateDemo {
    public static void main(String[] args) {
        //將【日期對象】轉換為【字符串】代碼示例
        Date date1 = new Date();
        //創建了一個日期格式。
        //SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        String result = sdf1.format(date1);
        System.out.println(result);

        //將【字符串】轉為【日期對象】代碼示例
        String str = "2012-12-12 12:12:12";
        //SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");

        Date date2 = null;
        try {
            date2 = sdf2.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        System.out.println(date2);
    }
}

Date 類的實例也有很多方法,這里就不演示了,大家可以自己進行學習研究,主要是因為目前 Date 類已經被使用的越來越少了,因為在 JDK8 以后有更好的 LocalDateTime 可以使用,我們重點介紹 LocalDateTime 的使用。



二、JDK8以后新增的日期時間類

類名 說明
LocalDate 表示日期(年月日)
LocalTime 表示時間(時分秒)
LocalDateTime 表示時間日期 (年月日時分秒)
DateTimeFormatter 將日期時間格式化為字符串或解析日期字符串
Period 表示日期間隔 (間隔的年數,月數,天數,總月數)
Duration 表示時間間隔 (間隔的秒數,毫秒數,納秒數)

對於 LocalDate 、 LocalTime 、LocalDateTime 這三個類來說,最常用的還是 LocalDateTime ,下面我們就以 LocalDateTime 為例進行代碼演示:

import java.time.LocalDateTime;

public class LocalDateTimeDemo {
    public static void main(String[] args) {
        //實例化 LocalDateTime 對象
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now); //打印系統本機當前時間

        //采用 of 的重載方法,按照指定的年月日時分秒實例化 LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.of(2022, 12, 12, 11, 11, 11);
        System.out.println(localDateTime);
    }
}

LocalDateTime 常用方法為下表,由於見名知意,非常簡單,這里就不再演示了。

方法名 說明
public int getYear() 獲取年
public int getMonthValue() 獲取月份(1-12)
public int getDayOfMonth() 獲取月份中的第幾天(1-31)
public int getDayOfYear() 獲取一年中的第幾天(1-366)
public DayOfWeek getDayOfWeek() 獲取星期
public int getMinute() 獲取分鍾(0 - 59)
public int getHour() 獲取小時(0 - 23)
public int getSecond() 獲取秒(0 - 59)

LocalDateTime 通過 DateTimeFormatter 與日期時間格式的字符串之間的轉換代碼演示如下:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDateTimeDemo {
    public static void main(String[] args) {
        //將字符串轉為為 LocalDateTime
        String str1 = "2022-11-11 12:13:15";
        DateTimeFormatter pattern1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime parse = LocalDateTime.parse(str1, pattern1);
        System.out.println(parse);

        //將 LocalDateTime 轉為為字符串
        LocalDateTime localDateTime = LocalDateTime.of(2022, 12, 12, 23, 59, 59);
        System.out.println(localDateTime);

        DateTimeFormatter pattern2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
        String str2 = localDateTime.format(pattern2);
        System.out.println(str2);
    }
}

LocalDateTime 進行日期加減的方法,對於以 plus 為開頭的方法來說,傳入正數為添加,傳入負數為減去。

方法名 說明
public LocalDateTime plusYears (long years) 添加或者減去年
public LocalDateTime plusMonths(long months) 添加或者減去月
public LocalDateTime plusDays(long days) 添加或者減去日
public LocalDateTime plusHours(long hours) 添加或者減去時
public LocalDateTime plusMinutes(long minutes) 添加或者減去分
public LocalDateTime plusSeconds(long seconds) 添加或者減去秒
public LocalDateTime plusWeeks(long weeks) 添加或者減去周

LocalDateTime 修改對應的日期時間的方法如下表,也是見名知意,非常簡單,這里就不演示了。

方法名 說明
public LocalDateTime withYear(int year) 直接修改年
public LocalDateTime withMonth(int month) 直接修改月
public LocalDateTime withDayOfMonth(int dayofmonth) 直接修改日期(一個月中的第幾天)
public LocalDateTime withDayOfYear(int dayOfYear) 直接修改日期(一年中的第幾天)
public LocalDateTime withHour(int hour) 直接修改小時
public LocalDateTime withMinute(int minute) 直接修改分鍾
public LocalDateTime withSecond(int second) 直接修改秒


Period 類主要用於計算兩個 LocalDate 的間隔,主要方法如下:
方法名 說明
public static Period between(開始時間,結束時間) 計算兩個日期的間隔
public int getYears() 獲得這段時間的年數
public int getMonths() 獲得此期間的總月數
public int getDays() 獲得此期間的天數
public long toTotalMonths() 獲取此期間的總月數

演示代碼如下:

import java.time.LocalDate;
import java.time.Period;

public class PeriodDemo {
    public static void main(String[] args) {
        //計算兩個日期之間的間隔,需要使用 LocalDate 對象
        LocalDate localDate1 = LocalDate.of(2022, 1, 1);
        LocalDate localDate2 = LocalDate.of(2050, 12, 12);
        Period period = Period.between(localDate1, localDate2);
        System.out.println(period);//P28Y11M11D

        //獲得間隔的年數
        System.out.println(period.getYears());//28
        //獲得間隔的月數
        System.out.println(period.getMonths());//11
        //獲得間隔的天數
        System.out.println(period.getDays());//11
        //獲取間隔的總月數
        System.out.println(period.toTotalMonths());//347

        /*
        從以上打印出來的結果可以發現,以 get 開頭的方法,獲取間隔的年數,月數,天數,並不是總數。
        其實就是對應年之間,對應月之間,對應天之間的相減,這一點需要特別注意
        以 to 開頭的方法,獲取的才是間隔的總數,但是 period 只有 toTotalMonths 這一個方法,
        要是有 toTotalDays 和 toTotalYears 方法就更好了。
        */
    }
}


Duration 類主要用於計算兩個 LocalDate 或 LocalDateTime 之間的間隔,主要方法如下:
方法名 說明
public static Durationbetween(開始時間,結束時間) 計算兩個日期時間的間隔
public long toDays() 獲得此時間間隔的總天數
public long toHours() 獲得此時間間隔的總小時數
public long toMinutes() 獲得此時間間隔的總分鍾數
public long toSeconds() 獲得此時間間隔的總秒數
public long toMillis() 獲得此時間間隔的總毫秒數
public long toNanos() 獲得此時間間隔的總納秒數

演示代碼如下:

import java.time.Duration;
import java.time.LocalDateTime;

public class DurationDemo {
    public static void main(String[] args) {
        LocalDateTime localDateTime1 = LocalDateTime.of(2021, 1, 1, 12, 12, 12);
        LocalDateTime localDateTime2 = LocalDateTime.of(2022, 2, 1, 12, 12, 12);
        Duration duration = Duration.between(localDateTime1, localDateTime2);
        System.out.println(duration);//PT9504H

        //獲得間隔的總天數
        System.out.println(duration.toDays()); //396
        //獲得間隔的總小時數
        System.out.println(duration.toHours()); //9504
        //獲得間隔的總分鍾數
        System.out.println(duration.toMinutes()); //570240
        //獲得間隔的總秒數
        System.out.println(duration.toSeconds()); //34214400
        //獲得間隔的總毫秒數
        System.out.println(duration.toMillis()); //34214400000
        //獲得間隔的總納秒數
        System.out.println(duration.toNanos()); //34214400000000000

        /*
        從上面的輸出結果可以發現,以 to 開頭的方法,獲取的都是對應的間隔總數
        這些方法的實現結果,是我們經常需要用到的
        */
    }
}

三 Date 和 LocalDateTime 相互轉換

Date 轉換為 LocalDateTime 的代碼示例:

import java.util.Date;
import java.time.ZoneId;
import java.time.LocalDateTime;

public class test {
    public static void main(String[] args) {

        //第一種 Date 轉 LocalDateTime 的方式
        Date d1 = new Date();
        LocalDateTime ldt1 =
                d1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        System.out.println(d1);
        System.out.println(ldt1);

        System.out.println("----------------");

        //第二種 Date 轉 LocalDateTime 的方式
        Date d2 = new Date();
        LocalDateTime ldt2 =
                LocalDateTime.ofInstant(d2.toInstant(),ZoneId.systemDefault());
        System.out.println(d2);
        System.out.println(ldt2);
    }
}

LocalDateTime 轉換為 Date 的代碼示例:

import java.time.ZonedDateTime;
import java.util.Date;
import java.time.ZoneId;
import java.time.LocalDateTime;

public class test {
    public static void main(String[] args) {

        LocalDateTime ldt = LocalDateTime.now();
        ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
        Date dd = Date.from(zdt.toInstant());

        System.out.println(ldt);
        System.out.println(dd);
    }
}


到此為止,Java 有關日期時間的操作,已經基本介紹完了。總體來說非常簡單,我在這里列出的都是比較常用的方法,至於其它方法的使用,需要用到的時候,查一下 Jdk 文檔或者上網查找一下相關資料即可,總之都是非常簡單。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM