JAVA筆記-Java8日期API
阿新 • • 發佈:2020-12-15
一、前言
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")));