1. 程式人生 > >jdk8 日期相關類

jdk8 日期相關類

在jdk8中的java.time包下增加了許多處理日期的類,這些類大多數是執行緒安全的

java.time 主要的日期處理相關類

LocalDate類,操作日期相關的資料
LocalTime類,操作時間相關的資料
LocalDateTime類,操作日期和時間
ZoneId設定時區
Duration類 求兩個LocalDate持續時間,對年月日可用
Period類 求兩個LocaTime持續時間,對時分秒可用
Clock時鐘類

java.time.chrono包下 主要是對應不同國家的日曆記錄的方式

java.time.format日期格式化相關的類

DateTimeFormatter類,內建多種時間格式化物件,也可以自定義格式化物件

java.time.temporal不同國家記錄時間的方式

java.time.zone設定時區相關的類

下面主要介紹幾個常用的類:

LocalDate類

java.time.LocalDate,處理跟本地時間相關的日期,不處理時間

常用方法

static LocalDate now() 從系統時鐘獲取現在時間,以預設的時區位置,有過載的方法,可以設定時區,也可以從Clock物件獲取 

設定日期:

static LocalDate parse(CharSequence text) 從字串解析日期,格式如yyyy-MM-dd
static LocalDate of(int year, int month, int dayOfMonth)  設定年月日三個引數

格式化

String format(DateTimeFormatter formatter)  將LocalDate物件按指定格式,格式化成字串

返回日期物件中的年,月,日

int getMonthValue() 獲取日期物件在一年中第幾個月
int getYear() 獲取日期物件是那一年
int getDayOfMonth() 獲取日期物件在它的月中是第幾天
int getDayOfYear()  獲取日期物件在它那一年是第幾天

判斷方法

boolean isLeapYear()  判斷日期物件所在的年是否為閏年

boolean equals(Object obj)  判斷兩個日期物件是否相同

設定一段時間後的日期

LocalDate plus(long amountToAdd, TemporalUnit unit) 返回當前物件加上一定日期後的新的日期物件,第一個引數是多少,第二個引數是單位
LocalDate plusDays(long daysToAdd) 返回當前物件加上一些天數後的新的日期物件
LocalDate plusMonths(long monthsToAdd) 返回當前物件加上一些月數後的新的日期物件
LocalDate plusWeeks(long weeksToAdd) 返回當前物件加上一些週數後的新的日期物件
LocalDate plusYears(long yearsToAdd)  返回當前物件加上一些年數後的新的日期物件

LocalTime類

java.time.LocalTime處理時間,不處理日期,下面介紹常用方法:

LocalDateTime atDate(LocalDate date) 結合LocalDate物件建立一個LocalDateTime物件

建立LocalTime物件

static LocalTime now() 獲取現在的時間,從系統Clock中,按預設的時區
static LocalTime now(Clock clock) 從給定的Clock物件獲取時間
static LocalTime now(ZoneId zone) 從系統時鐘按指定時區獲取時間
static LocalTime of(int hour, int minute) 根據時,分建立時間物件 
static LocalTime of(int hour, int minute, int second) 根據時,分,秒建立時間物件
static LocalTime of(int hour, int minute, int second, int nanoOfSecond) 根據時,分,秒,納秒建立時間物件
static LocalTime ofNanoOfDay(long nanoOfDay) 根據指定的納秒值建立LocalTime物件
static LocalTime ofSecondOfDay(long secondOfDay) 根據指定的秒值建立LocalTime物件. 
static LocalTime parse(CharSequence text) 根據指定的時間字串獲取LocalTime物件,格式 hh:mm:ss
static LocalTime parse(CharSequence text, DateTimeFormatter formatter) 根據給定時間字串和格式獲取LocalTime物件

格式化方法

String format(DateTimeFormatter formatter) 根據給定格式格式化時間

判斷方法

boolean equals(Object obj) 檢查兩個時間是否相等
boolean isAfter(LocalTime other) 判斷是否在給定時間物件之後
boolean isBefore(LocalTime other) 判斷是否在給定時間物件之前

獲取時,分,秒
int getHour() 獲取時間中的小時
int getMinute() 獲取時間中的分鐘
int getNano() 獲取時間中的毫秒
int getSecond() 獲取時間中的秒數
long toNanoOfDay() 獲取LocalTime在一天中的納秒數
int toSecondOfDay() 獲取LocalTime在一天中的秒數
獲取加上一段時間後的LocalTime物件
LocalTime plus(long amountToAdd, TemporalUnit unit) 獲取當前LocalTime物件加上一段時間後的LocalTime物件,第一個引數,數字,第二個引數 單位
LocalTime plusHours(long hoursToAdd) 獲取LocalTime加上一些小時之後的LocalTime物件
LocalTime plusMinutes(long minutesToAdd) 獲取LocalTime加上一些分鐘之後的LocalTime物件
LocalTime plusNanos(long nanosToAdd) 獲取LocalTime加上一些納秒之後的LocalTime物件
LocalTime plusSeconds(long secondstoAdd) 獲取LocalTime加上一些秒之後的LocalTime物件

按指定的時,或分,或者秒來設定LocalTime物件
LocalTime withHour(int hour) 指定LocalTime的小時欄位
LocalTime withMinute(int minute) 指定LocalTime的分鐘欄位. 
LocalTime withNano(int nanoOfSecond) 指定LocalTime的納秒欄位,如設定為0,則不顯示納秒欄位
LocalTime withSecond(int second) 指定LocalTime的秒欄位
 

下面介紹LocalDateTime類,java.time.LocalDateTime

LocalDateTime類

常用方法:

static LocalDateTime now()建立LocalDateTime物件,有過載的方法,類似於上面兩個類

static LocalDateTime of(LocalDate date, LocalTime time)  根據LocalDate物件和LocalTime物件建立LocalDateTime物件

static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)  根據給定的年月日時分秒建立物件

有過載的方法,類似於上面兩個類

static LocalDateTime parse(CharSequence text)  從給定字串建立LocalDateTime物件,格式為yyyy-MM-ddThh:mm:ss 中間的T不能省略

 

LocalDateTime,LocalDate,LocalTime三個類實現的介面一樣,方法也相似,不一 一列舉啦

下面看Duration類,處理兩個LocalDate之間的差值,java.time.Duration

Duration類

用來計算兩個LocalTime物件或者兩個兩個LocalDateTime物件之間相差的時間的

常用方法簡介:

static Duration between(Temporal startInclusive, Temporal endExclusive)根據兩個LocalTime或者兩個LocalDateTime建立Duration物件,引數,前小後大算出來正數,否則算出來負數

long getSeconds()得到Duration物件轉換成的秒數

long toDays() 將差值轉換為天數返回

Period類

java.time.Period  Period類用來計算兩個LocalDate相差的時間

常用方法簡介:

static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)根據給定的兩個LocalDate物件建立Period物件,引數前小後大,算出來的為正,否則算出來負數

計算相差的年月日

int getYears() 返回兩個localDate相差的年數

int getMonths(),兩個LocalDate之間相差的月數

int getDays()兩個LocalDate相差的天數

注意:計算年月日時,是按兩個localDate物件相差的日期來計算,比如2000年1月5日到2000年1月4日,得到的年月日分別為0年11月30日

ZoneId類

java.time.ZoneId,設定時區相關,我國屬於東八區,一般系統會預設設定好當地的時區

常用方法簡介:

static ZoneId of(String zoneId)根據字串設定時區,字串格式要正確

ZonedDateTime類

java.time.ZonedDateTime,獲取設定時區後的日期時間,預設為本地區的時區

now()獲取本地本時區的時間

ChronoUnit列舉類

java.time.temporal.ChronoUnit,這個類中存放了一些常量,類似於Calendar類,列舉幾個常見的

MINUTES 分鐘

HOURS 小時

DAYS 日

WEEKS 周

MONTHS 月

YEARS 年

在操作LocalTime plus(long amountToAdd, TemporalUnit unit) 等方法時,第一個引數是數值,第二個引數是單位,這個類中存放好了一些列舉值,可以直接呼叫作為第二個引數

程式碼示例

LocalDate示例:

package time;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class DateTest01 {
	public static void main(String[] args) {
		// 獲取LocalDate物件的三種方式,1now方法,獲取今天的日期
		LocalDate ld1 = LocalDate.now();
		System.out.println(ld1);
		// 2of方法
		LocalDate ld2 = LocalDate.of(2008, 6, 30);
		System.out.println(ld2);
		// parse方法
		LocalDate ld3 = LocalDate.parse("2008-06-30");
		System.out.println(ld3);
		// 獲取今天是這月第幾天
		int day = ld1.getDayOfMonth();
		System.out.println(day);
		// 獲取今天是今天第幾天
		System.out.println(ld1.getDayOfYear());
		// 獲取今天日期是第幾個月
		System.out.println(ld1.getMonthValue());
		// 判斷今年是否閏年
		System.out.println(ld1.isLeapYear());
		// 獲取本月有幾天
		System.out.println(ld1.getDayOfMonth());
		// 判斷ld2和ld3是否相對
		System.out.println(ld2.equals(ld3));
		// 設定兩週後的日期
		LocalDate ld4 = ld1.plus(2, ChronoUnit.WEEKS);
		System.out.println(ld4);

	}
}

LocalTime示例:

package time;

import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public class TimeTest02 {
	public static void main(String[] args) {
		LocalTime lt1 = LocalTime.now();
		System.out.println(lt1);
		// 不顯示毫秒
		LocalTime lt2 = LocalTime.now().withNano(0);
		System.out.println(lt2);
		// 設定時間1
		LocalTime lt3 = LocalTime.parse("15:15:15");
		// 設定時間2
		LocalTime lt4 = LocalTime.of(15, 15, 15);
		System.out.println(lt3 + ": " + lt4);
		// 判斷時間是否相等
		System.out.println(lt3.equals(lt4));
		// 設定兩小時後的時間物件
		LocalTime lt5 = lt1.plus(2, ChronoUnit.HOURS);
		System.out.println(lt5);
		// 獲取當前時間的小時
		System.out.println(lt1.getHour());
		// 指定當前時間小時欄位
		System.out.println(lt1.withHour(0));

	}
}

LocalDateTime示例:

package time;

import java.time.LocalDateTime;

public class LocalDateTimeTest03 {
	public static void main(String[] args) {
		LocalDateTime ldt1 = LocalDateTime.now();
		System.out.println(ldt1);
		// 將納秒去掉
		LocalDateTime ldt2 = LocalDateTime.now().withNano(0);
		System.out.println(ldt2);
		// 從字串解析時間
		LocalDateTime ldt3 = LocalDateTime.parse("2019-01-02T05:03:07");
		System.out.println(ldt3);
		LocalDateTime ldt4 = LocalDateTime.of(2015, 3, 4, 5, 6);
		System.out.println(ldt4);
	}
}

Duration和Period示例:

package time;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;

public class DurationAndPeriodTest04 {
	public static void main(String[] args) {
		// 測試Duration
		LocalDateTime ldt1 = LocalDateTime.of(2015, 3, 4, 23, 21);
		LocalDateTime ldt2 = LocalDateTime.of(2016, 3, 4, 23, 26);
		Duration dura1 = Duration.between(ldt1, ldt2);
		System.out.println(dura1.toDays());//輸出dura1表示的天數
		System.out.println(dura1.getSeconds());//輸出dura1表示的描述
		LocalTime lt1 = LocalTime.of(15, 23, 24);
		LocalTime lt2 = LocalTime.of(16, 23, 24);
		Duration dura2 = Duration.between(lt1, lt2);
		System.out.println(dura2.getSeconds());
		System.out.println(dura2.toDays());

		// 測試Period
		LocalDate ld1 = LocalDate.of(2000, 1, 5);
		LocalDate ld2 = LocalDate.of(2001, 1, 4);
		Period per1 = Period.between(ld1, ld2);
		System.out.println(per1.getDays());// 計算日期相差的值
		System.out.println(per1.getMonths());// 計算12個月之內 月份相差的值
		System.out.println(per1.getYears());// 計算相差幾年,不超過12個月不算一年
		System.out.println(
				ld1 + " and " + ld2 + "相差了" + per1.getYears() + "年" + per1.getMonths() + "月" + per1.getDays() + "日");

	}
}

ZoneId示例:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZoneIdTest05 {
	public static void main(String[] args) {
		// 計算從2000年1月1日到現在過了多少天,不要納秒值了
		LocalDateTime ldtNow = LocalDateTime.now().withNano(0);
		LocalDateTime ldt2000 = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
		Duration duralife = Duration.between(ldt2000, ldtNow);
		System.out.println(duralife.toDays());

		// 獲取本時區時間
		ZonedDateTime zdt1 = ZonedDateTime.now();
		System.out.println(zdt1);
		// 修改時區為美國的印第安納州
		ZoneId zoneChanged = ZoneId.of("US/East-Indiana");
		// 獲取指定時區的時間,呼叫過載的now方法
		ZonedDateTime zdt2 = ZonedDateTime.now(zoneChanged);
		System.out.println(zdt2);

	}
}

 

   參考:http://www.monkey1024.com/javase/718