1. 程式人生 > 其它 >JAVA筆記-Java8日期API

JAVA筆記-Java8日期API

技術標籤:Javajava

一、前言

Java8之前我們操作日期時間會用到Date、Calendar,格式化日期用到SimpleDateFormat、DateFormat。但是這些操作物件是執行緒不安全的,而且想要計算日期是比較繁瑣的。

Java8給我們提供了新的時間日期api而且這些都是執行緒安全的,應且效能有所提升,實現程式碼比較簡潔。

二、介紹

ZoneId: 時區ID,用來確定Instant和LocalDateTime互相轉換的規則

Instant: 用來表示時間線上的一個點(瞬時)

LocalDate: 表示沒有時區的日期(含年月日), LocalDate是不可變並且執行緒安全的

LocalTime: 表示沒有時區的時間(含時分秒), LocalTime是不可變並且執行緒安全的

LocalDateTime: 表示沒有時區的日期時間(年月日和時分秒), LocalDateTime是不可變並且執行緒安全的

Clock: 用於訪問當前時刻、日期、時間,用到時區

Duration: 用秒和納秒錶示時間的數量(長短),用於計算兩個日期的“時間”間隔

Period: 用於計算兩個“日期”間隔

四、常用方法

// 獲取當前時間
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
Clock clock = Clock.systemUTC(); // 根據系統時間和UTC返回當前時間
ZoneId zone = ZoneId.systemDefault();
ZoneId zoneId = ZoneId.of("UTC+8");
LocalDate.now(zoneId);

// 建立時間日期物件
LocalDate localDate = LocalDate.of(2020, 1, 1); // 2020-01-01
LocalTime localTime = LocalTime.of(1, 1, 1); // 01:01:01
LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 1, 1, 1); // 2020-01-01 01:01:01

// 日期時間的加減運算
LocalDateTime localDateTime = LocalDateTime.now(); // 當前日期
//以下方法的引數都是long型,返回值都是LocalDateTime
LocalDateTime plusYearsResult = localDateTime.plusYears(2L); // 當前日期加兩年
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L); // 當前日期加3個月
LocalDateTime plusDaysResult = localDateTime.plusDays(7L); // 當前日期加7天
LocalDateTime plusHoursResult = localDateTime.plusHours(2L); // 當前日期加2小時
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L); // 當前日期加10分鐘
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L); // 當前日期加10秒
// 或使用plus(long amountToAdd(偏移量), TemporalUnit unit(單位))方法
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
LocalDateTime nextWeek = localDateTime.plus(1, ChronoUnit.WEEKS);

// 直接修改當前日期到指定日期
LocalDate localDate = LocalDate.now(); // 當前日期
LocalDate withDayOfYearResult = localDate.withDayOfYear(200); // 本年當中的第幾天,取值範圍為1-365,366
LocalDate withDayOfMonthResult = localDate.withDayOfMonth(5); // 本月當中的第幾天,取值範圍為1-29,30,31
LocalDate withYearResult = localDate.withYear(2020); // 指定年份
LocalDate withMonthResult = localDate.withMonth(5); // 指定月份

// 獲取日期的明細-年月日周時分秒
LocalDateTime localDateTime = LocalDateTime.now(); // 當前日期
int dayOfYear = localDateTime.getDayOfYear(); // 本年中的第幾天
int dayOfMonth = localDateTime.getDayOfMonth(); // 本月當中第幾天
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek(); // 本週當中第幾天
int year = localDateTime.getYear(); // 當前年
Month month = localDateTime.getMonth(); // 當前月
int day = localDateTime.getDayOfMonth(); // 當前日
int hour = localDateTime.getHour(); // 當前小時
int minute = localDateTime.getMinute(); // 當前分鐘
int second = localDateTime.getSecond(); // 當前秒

// 日期的比較
LocalDate localDate1 = LocalDate.of(2020, 1, 1);
LocalDate localDate2 = LocalDate.of(2020, 1, 2);
boolean date1IsBeforeDate2 = localDate1.isBefore(localDate2);

// 判斷閏年
LocalDateTime localDateTime = LocalDateTime.now(); // 當前日期
localDateTime.isLeapYear();

// Instant和Date之間的轉換
Instant instant = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();

// 計算日期間隔
LocalDate date1 = LocalDate.of(2020, 1, 1);
LocalDate date2 = LocalDate.of(2020, 1, 2);
Period period = Period.between(date1, date2);
long years = period.get(ChronoUnit.YEARS); // 或者period.getYears()
long months = period.get(ChronoUnit.MONTHS);// 或者period.getMonths()
long days = period.get(ChronoUnit.DAYS); // 或者period.getDays()
LocalDateTime date3 = LocalDateTime.now();
LocalDateTime date4 = LocalDateTime.of(2020, 1, 1, 1, 1, 1);
Duration duration = Duration.between(date3, date4);
long days2 = duration.toDays(); // 間隔天
long hours = duration.toHours(); // 間隔小時
long minutes = duration.toMinutes(); // 間隔分鐘
long millis= duration.toMillis(); // 間毫秒
long nanos= duration.toNanos(); // 間隔納秒

// 程式執行時間
Instant ins1 = Instant.now();
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1, ins2);
long millis2 = duration.toMillis();

// 格式化用法
DateTimeFormatter formatter1 = DateTimeFormatter.ISO_DATE_TIME;
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalDateTime date1 = LocalDateTime.now();
String date1Str = formatter1.format(date1);// date1.format(formatter1)
String aa = formatter3.format(LocalDate.now());
String bb = formatter4.format(LocalTime.now());

// 時間字串轉日期物件 格式需與字串保持一致
String datetime =  "2020-01-01 01:01:01";  
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse(datetime, dtf);

// 將時間日期物件轉為格式化後的時間日期物件
LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String temp = dtf1.format(ldt1);
LocalDateTime formatedDateTime = LocalDateTime.parse(temp, dtf1);

// 獲取毫秒數
Instant ins = Instant.now();
Long milli = ins.toEpochMilli();

// 毫秒值轉換為日期
DateTimeFormatter df= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String longToDateTime = df.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()),ZoneId.of("Asia/Shanghai")));