成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java8新特性中的日期時間對象是什么

Java8新特性中的日期時間對象是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

我們擁有十多年網(wǎng)頁設(shè)計和網(wǎng)站建設(shè)經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、手機網(wǎng)站制作設(shè)計、H5建站、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計或者設(shè)計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計服務(wù)并滿足您的需求。

日期時間對象

關(guān)于日期時間的操作可以分為兩種:

轉(zhuǎn)換:與字符串的互相轉(zhuǎn)換,與時間戳的互相轉(zhuǎn)換  計算:計算兩個時間點之間的間隔、時間點與時間段的計算(計算下周N、下個月D日、去年M月D日等等)

Java8 提供了三個類:LocalDateLocalTime、LocalDateTime,它們的形式如 2020-01-01、12:30:002020-01-01 12:30:00

創(chuàng)建對象

獲取類對象的方法非常非常簡單

LocalDate now = LocalDate.now();LocalDate ld = LocalDate.of(2019, 1, 1);// 獲取年月日now.getYear();now.getMonthValue(); // 如果你調(diào)用了 now.getMonth() ,那么它將返回給你一個大寫的英文月份單詞now.getDayOfMonth();// 顧名應(yīng)該思義getDayOfWeek();getDayOfYear(); // 設(shè)置年月日LocalDate ld1 = ld.withYear(2021);  // 2021-01-01LocalDate ld2 = ld.withMonth(12);  // 2019-12-01LocalDate ld3 = ld.withDayOfMonth(12); // 2019-12-12// 你可能會納悶,既然是設(shè)置,為什么不用單詞 set 呢,而用 with// 因為,set 操作一般是改變調(diào)用對象本身,沒有返回值;// 而 with 是在調(diào)用對象基礎(chǔ)上另外創(chuàng)建一個新對象,設(shè)置好值后返回,沒有改變調(diào)用對象// 如果你是那個打破砂鍋的孩子,你可能會問:為什么不能改變調(diào)用對象?// 因為 LocalDate 是 final 修飾的(final 人稱 Java 界的自宮之刀)// 從物理的角度來講,目前人類無法改變時間(穿越)// 如果你有 ld.withMonth(13) 這種反人類歷法的操作,當然是會拋出異常的

LocalTime 和 LocalDateTime 都有類似于 LocalDate 的方法,這里就不一一列舉了(因為我感覺自己越來越像 api 文檔了)

Java8 API 官方文檔直通車

轉(zhuǎn)換

日期時間對象 和 字符串 之間的互相轉(zhuǎn)換:

// LocalDateTime 對象 -> 字符串DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime now = LocalDateTime.now();String dateTimeStr = now.format(dtf);System.out.println(dateTimeStr);// 字符串 -> LocalDateTime 對象String str = "2022-01-30 12:15:20";LocalDateTime dateTime = LocalDateTime.parse(str, dtf);System.out.println(dateTime);

DateTimeFormatter 類還提供一些現(xiàn)成的 formatter ,比如

DateTimeFormatter.BASIC_ISO_DATE ==> DateTimeFormatter.ofPattern("yyyyMMdd")DateTimeFormatter.ISO_LOCAL_DATE ==> DateTimeFormatter.ofPattern("yyyy-MM-dd")// 更多 formatter 可以 api 文檔中查詢

學習的本質(zhì),不在于記住哪些知識,而在于它觸發(fā)了你的思考?!?邁克爾·桑德爾

日期時間 和 時間戳 之間的互相轉(zhuǎn)換:

// LocalDateTime 對象 -> 時間戳LocalDateTime now = LocalDateTime.now();// 獲取系統(tǒng)默認時區(qū)ZoneId systemDefaultZoneId = ZoneId.systemDefault();Instant instant = now.atZone(systemDefaultZoneId).toInstant();long timestamp = instant.toEpochMilli();System.out.println(timestamp);// 時間戳 -> LocalDateTime 對象long timestamp2 = 1578919583784L;Instant instant2 = Instant.ofEpochMilli(timestamp2);LocalDateTime dateTime2 = LocalDateTime.ofInstant(instant2, systemDefaultZoneId);System.out.println(dateTime2);

“我不明白為什么要把時間戳搞得這么麻煩!”

另外:java.util.Date 與 java.time.LocalDateTime 之間的轉(zhuǎn)換需要通過 Instant 實現(xiàn),它倆都沒有提供直接的轉(zhuǎn)換方法

// 獲取系統(tǒng)默認時區(qū)ZoneId systemDefaultZoneId = ZoneId.systemDefault();// Date 轉(zhuǎn)為 LocalDateTimeDate date3 = new Date();Instant instant3 = date3.toInstant();LocalDateTime localDateTime3 = LocalDateTime.ofInstant(instant3, systemDefaultZoneId);// LocalDateTime 轉(zhuǎn)為 DateInstant instant4 = now.atZone(systemDefaultZoneId).toInstant();Date date4 = Date.from(instant4);

還有:LocalDateTime 可以由 LocalDate 和 LocalTime 組成,也可以拆分成它倆

LocalDate nowLocalDate = LocalDate.now();LocalTime nowLocalTime = LocalTime.now();LocalDateTime nowLocalDateTime = LocalDateTime.of(nowLocalDate, nowLocalTime);nowLocalDateTime.toLocalDate();nowLocalDateTime.toLocalTime();

計算

計算時間點與時間點之間的間隔:

// 計算日期時間之間的間隔LocalTime startTime = LocalTime.now();LocalTime endTime = startTime.plusHours(1).plusMinutes(50);Duration duration = Duration.between(startTime, endTime);// 間隔秒數(shù)duration.getSeconds();// 間隔天數(shù)duration.toDays();// 間隔小時數(shù)duration.toHours();// 間隔分鐘數(shù)duration.toMinutes();

Duration.between(start, end) 的參數(shù)可以是 LocalDateTime 、LocalTime

它只會返回一個整數(shù)(舍掉小數(shù)后的整數(shù),等同于 floor()),不會返回 1小時50分鐘 這樣的形式如果你想要 y年M個月d天 H小時m分鐘s秒 這種形式,或許你自己動手組裝一下了

// 計算日期之間的間隔LocalDate startDate = LocalDate.now();LocalDate endDate = LocalDate.of(2031, 1, 1);Period pe = Period.between(startDate, endDate);pe.getYears();pe.getMonths();pe.getDays();

時間點與時間段的計算:

public LocalDateTime plusYears(long years) {  LocalDate newDate = date.plusYears(years);  return with(newDate, time); } public LocalDateTime plusMonths(long months) {  LocalDate newDate = date.plusMonths(months);  return with(newDate, time); } public LocalDateTime plusWeeks(long weeks) {  LocalDate newDate = date.plusWeeks(weeks);  return with(newDate, time); } public LocalDateTime plusDays(long days) {  LocalDate newDate = date.plusDays(days);  return with(newDate, time); } public LocalDateTime plusHours(long hours) {  return plusWithOverflow(date, hours, 0, 0, 0, 1); } public LocalDateTime plusMinutes(long minutes) {  return plusWithOverflow(date, 0, minutes, 0, 0, 1); } public LocalDateTime plusSeconds(long seconds) {  return plusWithOverflow(date, 0, 0, seconds, 0, 1); } public LocalDateTime plusNanos(long nanos) {  return plusWithOverflow(date, 0, 0, 0, nanos, 1); } public LocalDateTime minusYears(long years) {  return (years == Long.MIN_VALUE ? plusYears(Long.MAX_VALUE).plusYears(1) : plusYears(-years)); } public LocalDateTime minusMonths(long months) {  return (months == Long.MIN_VALUE ? plusMonths(Long.MAX_VALUE).plusMonths(1) : plusMonths(-months)); } public LocalDateTime minusWeeks(long weeks) {  return (weeks == Long.MIN_VALUE ? plusWeeks(Long.MAX_VALUE).plusWeeks(1) : plusWeeks(-weeks)); } public LocalDateTime minusDays(long days) {  return (days == Long.MIN_VALUE ? plusDays(Long.MAX_VALUE).plusDays(1) : plusDays(-days)); } public LocalDateTime minusHours(long hours) {  return plusWithOverflow(date, hours, 0, 0, 0, -1); } public LocalDateTime minusMinutes(long minutes) {  return plusWithOverflow(date, 0, minutes, 0, 0, -1); } public LocalDateTime minusSeconds(long seconds) {  return plusWithOverflow(date, 0, 0, seconds, 0, -1); } public LocalDateTime minusNanos(long nanos) {  return plusWithOverflow(date, 0, 0, 0, nanos, -1); }

看吧,加減年數(shù)、月數(shù)、天數(shù)、小時數(shù)、分鐘數(shù)、秒數(shù)、毫秒數(shù)都有

想怎么用就怎么用,舉個小例子:

LocalDateTime now = LocalDateTime.now();// 30年后的今天(我還要上班,還沒退休)LocalDateTime after30Years = now.plusYears(30L);System.out.println(after30Years);// 347個月后(我就能還清貸款了 ╥﹏╥)LocalDateTime after348Months = now.plusMonths(347L);System.out.println(after348Months);// 11天后(就是除夕了)LocalDateTime after10Days = now.plusDays(10L);System.out.println(after10Days);// 8小時前(我在上班)LocalDateTime before8Hours = now.minusHours(8L);System.out.println(before8Hours);// 3分鐘前(我開始聽 Let it go 這首歌)LocalDateTime before3Before = now.minusMinutes(3L);System.out.println(before3Before);// 10秒前(寫下下面這條代碼)LocalDateTime before10Second = now.minusSeconds(10L);System.out.println(before10Second);

其實不用區(qū)分什么加減的,也可以用 plusXxx 做減法,只要傳入負數(shù)參數(shù)就行了

另外這里還有一類需求,比如:

明年的感恩節(jié)是哪天?(每年11月的第四個星期四為感恩節(jié))下周五是哪天?

這就要用到時間校正器 TemporalAdjuster這里容我先介紹一下 TemporalAdjuster,它是一個函數(shù)式接口,只有一個方法 adjustInto

@FunctionalInterfacepublic interface TemporalAdjuster { Temporal adjustInto(Temporal temporal);}

Temporal 是一個接口,LocalDateTime 、LocalDate 、 LocalTime 都是它的實現(xiàn)類

在 LocalDateTime 、LocalDate 、 LocalTime 中都有 with(TemporalAdjuster adjuster) 這個方法用來實現(xiàn)上面提到的另類需求。

// 下周五LocalDateTime now = LocalDateTime.now();LocalDateTime nextFriday = now.with(dt -> { // dt 是 `Temporal` 對象,但實質(zhì)上是調(diào)用對象的類型 LocalDateTime dateTime = (LocalDateTime) dt; // 非??上?,沒有 withDayOfWeek() 這個方法,要不然就會非常方便了 int dayOfWeekValue = dateTime.getDayOfWeek().getValue(); int fridayValue = DayOfWeek.FRIDAY.getValue(); return dateTime.plusWeeks(1L)    .plusDays(fridayValue - dayOfWeekValue);});System.out.println(nextFriday);// 明年的感恩節(jié)(明年11月第四個星期四)LocalDate thanksGivingDay = LocalDate.now().with( t -> { LocalDate d = (LocalDate) t; // 明年11月1日 LocalDate newDate = d.plusYears(1L).withMonth(11).withDayOfMonth(1); int dayOfWeekValue = newDate.getDayOfWeek().getValue(); int thursdayValue = DayOfWeek.THURSDAY.getValue(); long plusWeeks = dayOfWeekValue > thursdayValue ? 4L : 3L; return newDate.plusWeeks(plusWeeks)     .plusDays(thursdayValue - dayOfWeekValue);});System.out.println(thanksGivingDay);

其實 TemporalAdjusters 提供了許多 TemporalAdjuster 對象,就像上一節(jié) Stream 中 Collectors 之于 Collector 一樣 。

使用 TemporalAdjusters 能夠十分方便的實現(xiàn)上面的需求

// 下個周五LocalDateTime nextFriday = LocalDateTime.now().with(TemporalAdjusters.next(DayOfWeek.FRIDAY));System.out.println(nextFriday);// 明年的感恩節(jié)(明年11月第四個星期四)LocalDate date = LocalDate.now().plusYears(1L).withMonth(11);LocalDate thanksGivingDay = date.with(TemporalAdjusters.dayOfWeekInMonth(4, DayOfWeek.THURSDAY));System.out.println(thanksGivingDay);

注意: TemporalAdjusters.next(DayOfWeek day) 方法返回的是 接下來第一個周五,并不是我們一般理解的 下周五,比如說:今天 2020-01-13(周一),那么返回的就是 2020-01-17 四天后的周五。

另外 TemporalAdjusters 并不止提供了上面這2個方法,還有很多其他方法, API 文檔 中給出了足夠多的例子,一看就明白了。

建議有興趣的同學,去閱讀一些源碼,參考 Java8 代碼邏輯,然后用其他編程語言實現(xiàn)相同的日期時間操作,因為在其他編程中(比如 javaScript)也會經(jīng)常用到日期時間的操作

其他特性

羅列出來表示我知道他們,但不表示我理解他們,所以 Let It Go!

接口中的默認方法

接口中的靜態(tài)方法

Optional 類

Optional<String> op = Optional.of(str);

它是用來標識這個變量有可能為空。

如果一個變量有可能為空,Java8 之前我們每次使用這個變量時,都必須判斷它是否為空?,F(xiàn)在也是??!

Optional 并不能避免空指針異常,僅僅是表示標識變量可能為空。打個比方:

前面一條路上埋了地雷,但從表面上完全看不出來,除非我們走一步都扔石頭試一下,否則說不準哪一步就炸了。而 Optional就是用來標識地雷位置的,我們知道了哪個位置有雷,就會繞著走,從而能夠安全通過

另外 Optional 還提供了一個設(shè)置默認值的功能,挺好玩的。

Integer pageSize = null;// 以前我們設(shè)置默認值//pageSize = pageSize == null ? 10 : pageSize;//System.out.println(pageSize);// 使用 Optional 設(shè)置默認值pageSize = Optional.ofNullable(pageSize) .orElse(20);System.out.println(pageSize);// 自定義默認值Integer defaultPageSize = Optional.ofNullable(pageSize)  .orElseGet(() -> {   return new Integer(50);  });

結(jié)語

Java8 新特性系列隨便到此就結(jié)束了。

最最關(guān)鍵的,還是多看 Java 官方 API 文檔??!

我在想可能我們被矯枉過正了。各種各樣技術(shù)群最多的回答都是:去問百度?。?百度全知道嗎?!

說實在的,在今天這個時代,是個人都能在網(wǎng)絡(luò)上發(fā)表文章言論,然后大家再互相轉(zhuǎn)載,假的都能成為真的!沒有經(jīng)過驗證就轉(zhuǎn)載的;在當時有效,現(xiàn)在過時了的;隨便在文章中一個轉(zhuǎn)載鏈接的 ... 比比皆是

看完上述內(nèi)容,你們掌握Java8新特性中的日期時間對象是什么的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當前名稱:Java8新特性中的日期時間對象是什么
URL地址:http://jinyejixie.com/article10/gggggo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、企業(yè)建站標簽優(yōu)化、服務(wù)器托管網(wǎng)站設(shè)計、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
呼和浩特市| 团风县| 洪泽县| 泰宁县| 洛川县| 珲春市| 拉萨市| 毕节市| 洞口县| 留坝县| 边坝县| 许昌县| 沂源县| 灵丘县| 麻阳| 色达县| 吴川市| 泰顺县| 万安县| 阜平县| 吴旗县| 乐陵市| 墨玉县| 岳阳市| 泸水县| 普兰店市| 太白县| 繁昌县| 青神县| 环江| 河间市| 星子县| 漳州市| 合江县| 金阳县| 沈丘县| 高安市| 房产| 夏河县| 望谟县| 浏阳市|