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 文檔或者上網查找一下相關資料即可,總之都是非常簡單。