日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java 时间api源码,时间API(示例代码)

發(fā)布時間:2025/4/16 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 时间api源码,时间API(示例代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 時間API

我們的時間在java里是long類型的整數(shù),這個整數(shù)稱之為時間戳(也叫格林威治時間),即從1970-01-01到現(xiàn)在為止所經(jīng)過的毫秒數(shù),單有這個時間戳是不能準(zhǔn)確表達(dá)世界各地的時間,還需加上時區(qū)。比如現(xiàn)在輸出筆者本地的時間Mon Feb 10 09:48:43 GMT+08:00 2020,其中 GMT+08:00 表示格林威治時間的東8區(qū),也就是北京時間。

2. 舊時間API

java有兩套與時間相關(guān)的API,分別位于java.util和java.time下,現(xiàn)在更推薦使用time包下的API,由于歷史原因,我們還需兼容以前版本的時間函數(shù),所以util也要來學(xué)習(xí)一下

2.1 Date

Date類內(nèi)部原理

private transient long fastTime;

public Date() {

this(System.currentTimeMillis());

}

public Date(long date) {

fastTime = date;

}

從變量可以看出java時間戳使用long類型存儲

默認(rèn)構(gòu)造函數(shù)中的System.currentTimeMillis()獲取的是當(dāng)前的時間戳

有參構(gòu)造說明Date類是依賴時間戳的

從API和JDK可以知道Date內(nèi)部很多函數(shù)都棄用了,打上了@Deprecated標(biāo)簽,舊API中也不推薦使用了,相對推薦使用后面的Calendar類

@Deprecated

public Date(int year, int month, int date) {}

@Deprecated

public Date(String s) {}

下面列出常用的方法

類型

函數(shù)名

解釋

long

getTime

返回Date對象表示的時間戳

int

getYear

返回Date對象表示的年,需+1900

int

getMonth

返回Date對象表示的月,需+1

int

getDate

返回Date對象表示的日

int

getHours

返回Date對象表示的小時

int

getMinutes

返回Date對象表示的分鐘

int

getSeconds

返回Date對象表示的秒

int

getDay

返回Date對象表示的周幾

例子

Date date = new Date();

System.out.println(date.getTime());

System.out.println(date.getYear() + 1900);

System.out.println(date.getMonth() + 1);

System.out.println(date.getDate());

1581301070240

2020

2

10

簡單使用時間格式化類

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println("簡單使用時間格式化類: " + sdf.format(date));

System.out.println("原本的輸出:" + date);

簡單使用時間格式化類: 2020-02-10 10:24:13

原本的輸出:Mon Feb 10 10:24:13 GMT+08:00 2020

2.2 Calendar

Calendar類比Date多了日期計算功能,還有時區(qū)。并且Calendar是抽象類,構(gòu)造方法為protected即外部包沒有繼承關(guān)系不能訪問的,不過他提供了getInstance來獲取實例

獲取實例

protected Calendar(){

// 省略內(nèi)部如何實現(xiàn)

}

public static Calendar getInstance(){

// 省略內(nèi)部如何實現(xiàn)

}

常用方法

類型

函數(shù)名

解釋

int

get(int field)

返回日歷給定字段的值

Date

getTime

返回當(dāng)前Calendar表示的Date

void

setTimeZone(TimeZone value)

設(shè)置時區(qū)

void

add(int field, int amount)

當(dāng)前日歷在給定字段上增加給定值

void

setTime(Date date)

將給定Date設(shè)置為日歷

栗子

Calendar calendar = Calendar.getInstance();

System.out.println(calendar.get(Calendar.YEAR));

System.out.println(calendar.get(Calendar.MONTH) + 1);

System.out.println(calendar.get(Calendar.DATE));

calendar.add(Calendar.YEAR,200);

System.out.println(calendar.get(Calendar.YEAR));

Date date = calendar.getTime();

2020

2

10

2220

2.3 TimeZone

TimeZone類就是可以設(shè)置時區(qū)咯

常用方法

類型

函數(shù)名

解釋

TimeZone

getDefault

返回默認(rèn)時區(qū)

TimeZone

getTimeZone(String ID / zoneId)

返回給定字符串對應(yīng)的時區(qū)

板栗

Calendar calendar = Calendar.getInstance();

System.out.println(calendar.get(Calendar.HOUR)); // 筆者當(dāng)前時間11:09

calendar.setTimeZone(TimeZone.getTimeZone("GMT+10:00"));

System.out.println(calendar.get(Calendar.HOUR)); // 東10區(qū)時間為01:09

11

1

3. java1.8的新時間API

推出新時間API是因為舊API飽受詬病,因為:

Date為可變(多線程訪問時間會變化)

輸出不人性化(Mon Feb 10 10:24:13 GMT+08:00 2020,且從1900開始計算)

格式化類線程不安全(多線程訪問格式化不同)

所以新API,java.time包所有類都是不可變和線程安全,且區(qū)分日期與時間

LocalDate date = LocalDate.now();

LocalTime time = LocalTime.now();

LocalDateTime dateTime = LocalDateTime.now();

System.out.println(date);

System.out.println(time);

System.out.println(dateTime);

2020-02-10

11:39:57.147

2020-02-10T11:39:57.147

輸出看起來是不是很舒服,可是LocalDateTime的輸出有點懵?,特意找了LocalDateTime的toString方法

@Override

public String toString() {

return date.toString() + 'T' + time.toString();

}

從中可以看出內(nèi)部是維護(hù)了LocalDate和LocalTime了,中間使用了字符 T隔開,為什么不用空格????

3.1 LocalDate

常用方法

類型

函數(shù)名

解釋

LocalDate

now

返回當(dāng)前日期

int

getYear

返回年

int

getMonthValue

返回月

int

getDayOfMonth

返回日

LocalDate

of(int year, int month, int dayOfMonth)

創(chuàng)建實例

西瓜

LocalDate localDate = LocalDate.now();

System.out.println(localDate.getYear());

System.out.println(localDate.getMonthValue());

System.out.println(localDate.getDayOfMonth());

2020

2

10

3.2 LocalTime

這些其實都差不多就不一一說明了

桃子

LocalTime localTime = LocalTime.now();

System.out.println(localTime.getHour());

System.out.println(localTime.getMinute());

System.out.println(localTime.getSecond());

12

1

18

3.3 LocalDateTime

這里新增了plus和minus方法,對應(yīng)加減,因為是不可變性,所以和String類一樣,返回一個新副本

蘋果

LocalDateTime localDateTime = LocalDateTime.now();

System.out.println(localDateTime);

LocalDateTime localTime1 = localDateTime.plusYears(1).plusMonths(1).plusDays(1);

System.out.println(localTime1);

LocalDateTime localTime2 = localDateTime.minusYears(1).minusMonths(1).minusDays(1);

System.out.println(localTime2);

2020-02-10T12:07:44.403

2021-03-11T12:07:44.403

2019-01-09T12:07:44.403

3.4 獲取時間戳

Instant timestamp = Instant.now();

3.5 獲取時間差

LocalDateTime startDateTime = LocalDateTime.of(2020, 2, 10, 10, 10, 10);

LocalDateTime endDateTime = LocalDateTime.of(2019, 1, 9, 9, 9, 9);

Duration duration = Duration.between(startDateTime, endDateTime);

System.out.println(duration);

PT-9529H-1M-1S // 相隔9529小時1分1秒

總結(jié)

以上是生活随笔為你收集整理的java 时间api源码,时间API(示例代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。