java8中的LocalDate,LocalTime,LocalDateTime與Date的轉換和使用


基本概念

時刻:所有計算機系統內部都用一個整數表示時刻,這個整數是距離格林尼治標准時間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 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

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



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