基本概念
時刻:所有計算機系統內部都用一個整數表示時刻,這個整數是距離格林尼治標准時間1970年1月1日0時0分0秒的毫秒數,可以理解時刻就是絕對時間,它與時區無關,不同時區對同一時刻的解讀,即年月日時分秒是不一樣的;
時區:同一時刻,世界上各個地區的時間可能是不一樣的,具體時間與時區有關,一共有24個時區,英國格林尼治是0時區,北京是東八區,也就是說格林尼治凌晨1點,北京是早上9點;
年歷:我們都知道,中國有公歷和農歷之分,公歷和農歷都是年歷,不同的年歷,一年有多少月,每月有多少天,甚至一天有多少小時,這些可能都是不一樣的,我們主要討論公歷。
Java 8中表示日期和時間的類有多個,主要的有:
Instant:它代表的是時間戳,表示時刻,不直接對應年月日信息,需要通過時區轉換
LocalDateTime: 表示與時區無關的日期和時間信息,不直接對應時刻,需要通過時區轉換
LocalDate:表示與時區無關的日期,與LocalDateTime相比,只有日期信息,沒有時間信息
LocalTime:表示與時區無關的時間,與LocalDateTime相比,只有時間信息,沒有日期信息
ZonedDateTime: 表示特定時區的日期和時間
ZoneId/ZoneOffset:表示時區
---------------------
原文:https://blog.csdn.net/u010002184/article/details/79713573
代碼:
package com.wangwenjun.java8; import java.time.Duration; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Period; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; public class LocalDateUtil { private final static String FORMAT_PATTERN1="yyyy-MM-dd HH:mm:ss"; private final static String FORMAT_PATTERN2="yyyyMMddHHmmss"; private final static String FORMAT_PATTERN3="yyyy-MM-dd"; private final static String FORMAT_PATTERN4="yyyyMMdd"; public static void main(String[] args) { Date date1=new Date(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(localDateFormat(LocalDate.now(),FORMAT_PATTERN3)); System.out.println(localDateTimeFormat(LocalDateTime.now(),FORMAT_PATTERN1)); System.out.println(localDateTimeFormat(LocalDateTime.now(),FORMAT_PATTERN2)); System.out.println(localDateTimeToDate(LocalDateTime.now())); System.out.println(dateFormat(new Date(),FORMAT_PATTERN4)); System.out.println(minusToMillsLocalDateTime(LocalDateTime.now(),LocalDateTime.now().minusSeconds(1))); System.out.println(minusToMillsDate(date1,new Date())); System.out.println(localDateParse("2018-06-12",FORMAT_PATTERN3)); System.out.println(localDateTimeParse("2018-06-12 16:04:43",FORMAT_PATTERN1)); Period p=periodDate(date1,new Date()); System.out.println("year:"+p.getYears()+"month:"+p.getMonths()+"day:"+p.getDays()); System.out.println("----------------------------------------------------------------"); Date date2=localDateToDate(LocalDate.now().minusMonths(1).minusDays(2)); Date date3=localDateToDate(LocalDate.now()); Period p2=periodDate(date2,date3); System.out.println("year:"+p2.getYears()+"month:"+p2.getMonths()+"day:"+p2.getDays()); System.out.println("----------------------------------------------------------------"); Period p1=periodLocalDate(LocalDate.now().minusDays(2),LocalDate.now()); System.out.println("year:"+p1.getYears()+"month:"+p1.getMonths()+"day:"+p1.getDays()); } /** * 將localDate 按照一定的格式轉換成String * @param localDate * @param pattern * @return */ public static String localDateFormat(LocalDate localDate,String pattern){ return localDate.format(DateTimeFormatter.ofPattern(pattern)); } /** * 將localDateTime 按照一定的格式轉換成String * @param localDateTime * @param pattern * @return */ public static String localDateTimeFormat(LocalDateTime localDateTime,String pattern){ return localDateTime.format(DateTimeFormatter.ofPattern(pattern)); } /** * 將String 按照pattern 轉換成LocalDate * @param time * @param pattern * @return */ public static LocalDate localDateParse(String time,String pattern){ return LocalDate.parse(time,DateTimeFormatter.ofPattern(pattern)); } /** * 將String 按照pattern 轉換成LocalDateTime * @param time * @param pattern * @return */ public static LocalDateTime localDateTimeParse(String time,String pattern){ return LocalDateTime.parse(time,DateTimeFormatter.ofPattern(pattern)); } /** * 將date轉換成String * @param date * @param pattern * @return */ public static String dateFormat(Date date,String pattern){ return localDateTimeFormat(dateToLocalDateTime(date),pattern); } /** * 將LocalDate 轉換成 Date * @param localDate * @return */ public static Date localDateToDate(LocalDate localDate){ ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = localDate.atStartOfDay(zoneId); return Date.from(zdt.toInstant()); } /** * 將LocalDateTime 轉換成 Date * @param localDateTime * @return */ public static Date localDateTimeToDate(LocalDateTime localDateTime){ ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = localDateTime.atZone(zoneId); return Date.from(zdt.toInstant()); } /** * 將 Date 轉換成LocalDate * atZone()方法返回在指定時區從此Instant生成的ZonedDateTime。 * @param date * @return */ public static LocalDate dateToLocalDate(Date date){ Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); return instant.atZone(zoneId).toLocalDate(); } /** * 將 Date 轉換成LocalDateTime * atZone()方法返回在指定時區從此Instant生成的ZonedDateTime。 * @param date * @return */ public static LocalDateTime dateToLocalDateTime(Date date){ Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); return instant.atZone(zoneId).toLocalDateTime(); } /** * 計算兩個LocalDateTime 之間的毫秒數 * @param time1 * @param time2 * @return */ public static Long minusToMillsLocalDateTime(LocalDateTime time1,LocalDateTime time2){ return Duration.between(time1, time2).toMillis(); } /** * 計算兩個LocalTime 之間的毫秒數 * @param time1 * @param time2 * @return */ public static Long minusToMillsLocalTime(LocalTime time1,LocalTime time2){ return Duration.between(time1, time2).toMillis(); } /** * 計算兩個LocalDate 之間的毫秒數 * @param time1 * @param time2 * @return */ public static Long minusToMillsLocalDate(LocalDate time1,LocalDate time2){ return Duration.between(time1, time2).toMillis(); } /** * 計算兩個LocalDate 之間的Period * @param time1 * @param time2 * @return */ public static Period periodLocalDate(LocalDate time1,LocalDate time2){ return Period.between(time1,time2); } /** * 計算兩個Date 之間的Period * @param date1 * @param date2 * @return */ public static Period periodDate(Date date1,Date date2){ return periodLocalDate(dateToLocalDate(date1),dateToLocalDate(date2)); } /** * 計算兩個Date之間的 Period * @param time1 * @param time2 * @return */ public static Long minusToMillsDate(Date time1,Date time2){ return minusToMillsLocalDateTime(dateToLocalDateTime(time1),dateToLocalDateTime(time2)); } } --------------------- 原文:https://blog.csdn.net/qq_36305027/article/details/80668211
Instant時間戳類 (一)含義:從1970-01-01 00:00:00到當前時間的毫秒值 (二)常用的方法: now(): 獲取當前的時間,獲取的是當前的美國時間,和處於東八區的我們相差八個小時。 Instant ins=Instant.now(); System.out.println(ins); atOffset(): 設置偏移量例如: OffsetDateTime time=ins.atOffset(ZoneOffset.ofHours(8)); System.out.println(time); atZone() 獲取系統默認時區時間,參數為一個時區的編號,可以通過時區編號類獲取出來 還可以通過Zoneld.systemDefault()來獲取本地的默認時區ID ZonedDateTime zoneDateTime=ins.atZone(Zoneld.systemDefault()); System.out.println(zonedDateTime); get系列的方法 getEpochSecond():獲取從1970-01-01 00:00:00到當前時間的秒值 getNano():把獲取到的當前時間的描述換算成納秒 ofEpochSecond()方法:在計算機元年(1970-01-01 00:00:00)的基礎上增加秒數 Instant instant=Onstant.ofEpochSecond(5); System.out.println(instant) Duration類 用法:用於計算兩個時間間隔的類 常用方法: between():計算兩個時間的間隔,默認的單位是秒 例:Duration between =Duration.between(start,end); toMillis()方法:將秒轉換成毫秒 System.out.println(between.toMillis()); Period 類 常用方法:between():計算兩個時間之間的間隔 LocalDate s=LocalDate.of(1985,03,05); LocalDate now=LocalDate,now(); Periodbe=Period.between(s,now); System.out.println(be.getYears()); System.out.println(be.getMonth()); System.out.println(be.getDays()) TemporalAdjuster: 時間校正器(接口) 一般我們使用該接口的一個實現類TemporalAdjusters中的一些常量來指定日期。 (1)使用TemporalAdjusters自帶的常量來設置日期 LocalDate now=LocalDate.now(); System.out.println(now); LocalDate with =now.with(TemporalAdjusters.lastDayOdYear()); System.out.println(with); (2)采用TemporalAdjusters中的next方法來指定日期 LocalDate date = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); System.out.println(date); (3)采用自定義的方法來指定日期 LocalDateTime ldt = LocalDateTime.now(); LocalDateTime workDay = ldt.with(new TemporalAdjuster() { public Temporal adjustInto(Temporal temporal) { LocalDateTime ld = (LocalDateTime) temporal; DayOfWeek dayOfWeek = ld.getDayOfWeek(); if (dayOfWeek.equals(DayOfWeek.FRIDAY)) { return ld.plusDays(3); } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) { return ld.plusDays(2); } else { return ld.plusDays(1); } DateTimerFormatter 解析和格式化日期或時間 常用方法: ofPattern("yyyy-MM-dd");:獲取對象的靜態方法 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDateTime now = LocalDateTime.now(); format():把一個日期對象的默認格式格式化成指定的格式 String format1 = dateFormat.format(now); System.out.println(format1); 還可以使用日期類中的format 方法傳入一個日期格式化類對象。 now1.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); ZoneID世界時區類 常用方法 getAvailableZonelds():獲取世界各個地方的時區的集合 Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); ZoneId.systemDefault():獲取系統默認時區的ID ZoneIdzoneId = ZoneId.systemDefault(); //中國為Asia/Shanghai --------------------- 作者:魚刺_64 來源:CSDN 原文:https://blog.csdn.net/yuyuyu1111112/article/details/79187541 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
