国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Java 8 新特性之新的時(shí)間日期 API

JaysonWang / 663人閱讀

摘要:概述簡(jiǎn)介引入了一套全新的時(shí)間日期,操作起來(lái)更簡(jiǎn)便。可以使用的鎖解決的線程安全問(wèn)題測(cè)試方法使用進(jìn)行格式化,是線程安全的時(shí)區(qū)設(shè)置帶時(shí)區(qū)的時(shí)間本文首發(fā)于凌風(fēng)博客新特性之新的時(shí)間日期作者凌風(fēng)

1. 概述 1.1 簡(jiǎn)介

Java 8 引入了一套全新的時(shí)間日期API,操作起來(lái)更簡(jiǎn)便。簡(jiǎn)單介紹下,LocalDateLocalTimeLocalDateTime的使用;

java.util.Date月份從0開(kāi)始,java.time.LocalDate月份從1開(kāi)始并且提供了枚舉。

java.util.DateSimpleDateFormatter都不是線程安全的,而LocalDateLocalTime和最基本的String一樣,是不變類(lèi)型,不但線程安全,而且不能修改,它們分別使用 ISO-8601 日歷系統(tǒng)的日期和時(shí)間,它們提供了簡(jiǎn)單的日期或時(shí)間,并不包含當(dāng)前的時(shí)間信息,也不包含與時(shí)區(qū)相關(guān)的信息。

注 : ISO-8601 日歷系統(tǒng)是國(guó)際標(biāo)準(zhǔn)化組織制定的現(xiàn)代公民的日期和時(shí)間的表示法
1.3 環(huán)境 2. LocalDate、LocalTime、LocalDateTime

LocalDateLocalTimeLocalDateTime 三者的使用方式基本一致,所以我們這里就以 LocalDateTime 為例進(jìn)行索命

2.1 實(shí)例
@Test
public void t1() {
    // 獲取當(dāng)前時(shí)間
    LocalDateTime ldt1 = LocalDateTime.now();
    System.out.println(ldt1);

    // 獲取指定的時(shí)間
    LocalDateTime ldt2 = LocalDateTime.of(2018, 12, 10, 10, 10, 10);
    System.out.println(ldt2);

    // 加兩年
    LocalDateTime ldt3 = ldt1.plusYears(2);
    System.out.println(ldt3);

    // 減兩個(gè)月
    LocalDateTime ldt4 = ldt1.minusYears(2);
    System.out.println(ldt4);

    // 獲取年月日時(shí)分秒
    System.out.println(ldt1.getYear());
    System.out.println(ldt1.getMonthValue());
    System.out.println(ldt1.getDayOfMonth());
    System.out.println(ldt1.getHour());
    System.out.println(ldt1.getMinute());
    System.out.println(ldt1.getSecond());
}
2.2 Instant : 時(shí)間戳

使用 Unix 元年 1970年1月1日 00:00:00 所經(jīng)歷的毫秒值

@Test
public void t2() {
    Instant ins = Instant.now();  //默認(rèn)使用 UTC 時(shí)區(qū)
    System.out.println(ins);

    // 時(shí)間偏移量
    OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));
    System.out.println(odt);

    // 獲取毫秒值
    System.out.println(ins.getNano());
    
    // 對(duì)于元年開(kāi)始進(jìn)行運(yùn)算
    Instant ins2 = Instant.ofEpochSecond(60);
    System.out.println(ins2);
}
2.3 Duration : 用于計(jì)算兩個(gè)“時(shí)間”間隔
@Test
public void t3() throws InterruptedException {
    // 時(shí)間戳
    Instant ins1 = Instant.now();

    Thread.sleep(1000);

    Instant ins2 = Instant.now();
    Duration duration = Duration.between(ins1, ins2);
    System.out.println("所耗費(fèi)時(shí)間為:" + duration.toMillis());

    System.out.println("--------------------------------");

    // LocalTime
    LocalTime lt1 = LocalTime.now();

    Thread.sleep(1000);

    LocalTime lt2 = LocalTime.now();

    System.out.println("所耗費(fèi)時(shí)間為:" + Duration.between(lt1, lt2).toMillis());
}
2.4 Period : 用于計(jì)算兩個(gè)“日期”間隔
@Test
public void t5() {
    LocalDate ld1 = LocalDate.of(2017, 1, 1);
    LocalDate ld2 = LocalDate.now();
    Period period = Period.between(ld1, ld2);
    System.out.println("相差" + period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "天");
}
2.5 日期的操作

TemporalAdjuster 時(shí)間校正器,有時(shí)我們可能需要獲取例如:將日期調(diào)整到下個(gè)周日等操作。

TemporalAdjusters 該類(lèi)通過(guò)靜態(tài)方法提供了大量的常用 TemporalAdjuster 的實(shí)現(xiàn)。

@Test
public void t6() {
    LocalDateTime ldt = LocalDateTime.now();

    // 指定這個(gè)月的一個(gè)固定日期
    LocalDateTime ldt2 = ldt.withDayOfMonth(10);
    System.out.println(ldt2);

    // 獲取下個(gè)周日
    LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
    System.out.println("獲取下個(gè)周日 : " + ldt3);

    // 自定義:獲取下個(gè)工作日
    LocalDateTime ldt5 = ldt.with((l) -> {
        LocalDateTime ldt6 = (LocalDateTime) l;
        DayOfWeek dayOfWeek = ldt6.getDayOfWeek();

        if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
            return ldt6.plusDays(3);
        } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
            return ldt6.plusDays(2);
        } else {
            return ldt6.plusDays(1);
        }
    });
    System.out.println("獲取下個(gè)工作日 : " + ldt5);
}
3. DateTimeFormatter 3.1 簡(jiǎn)介

在 JDK 1.8 中可以使用 DateTimeFormatter 來(lái)代替 SimpleDateFormat 進(jìn)行日期的格式化,而且 DateTimeFormatter 是線程安全的

3.2 實(shí)例
@Test
public void t8() {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime ldt = LocalDateTime.now();

    // 將日期格式化為字符串,兩種方式否可以
    String dtfDate = dtf.format(ldt);
    String ldtDate = ldt.format(dtf);
    System.out.println("dtfDate : " + dtfDate);
    System.out.println("ldtDate : " + ldtDate);

    // 將字符串格式化為 LocalDateTime
    LocalDateTime ldt2 = LocalDateTime.parse(dtfDate, dtf);
    System.out.println("時(shí)間為 : " + ldt2);
}
3.3 線程安全

在多線程使用 SimpleDateFormat 進(jìn)行格式化日期的時(shí)候會(huì)有線程安全問(wèn)題。

@Test
public void t1() throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    Callable task = new Callable() {
        @Override
        public Date call() throws Exception {
            return sdf.parse("2018-12-10");
        }
    };

    ExecutorService executor = Executors.newFixedThreadPool(10);
    List> results = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        results.add(executor.submit(task));
    }

    for (Future future : results) {
        System.out.println(future.get());
    }
    executor.shutdown();
}

可以使用 ThreadLocal 的鎖解決 SimpleDateFormat 的線程安全問(wèn)題

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatThreadLocal {
    private static final ThreadLocal df = new ThreadLocal() {
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

    public static final Date convert(String source) throws ParseException {
        return df.get().parse(source);
    }
}

測(cè)試方法

@Test
public void t2() throws Exception {
    Callable task = new Callable() {
        @Override
        public Date call() throws Exception {
            return DateFormatThreadLocal.convert("2018-12-10");
        }
    };

    ExecutorService executor = Executors.newFixedThreadPool(10);
    List> results = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        results.add(executor.submit(task));
    }

    for (Future future : results) {
        System.out.println(future.get());
    }
    executor.shutdown();
}

使用 DateTimeFormatter 進(jìn)行格式化,DateTimeFormatter 是線程安全的

@Test
public void t3() throws Exception {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    Callable task = new Callable() {
        @Override
        public LocalDate call() throws Exception {
            return LocalDate.parse("2018-12-10",dtf);
        }
    };

    ExecutorService executor = Executors.newFixedThreadPool(10);
    List> results = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        results.add(executor.submit(task));
    }

    for (Future future : results) {
        System.out.println(future.get());
    }
    executor.shutdown();
}
4. 時(shí)區(qū)設(shè)置
@Test
public void t2() {
    LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
    System.out.println(ldt);

    // 帶時(shí)區(qū)的時(shí)間
    ZonedDateTime zdt = ldt.atZone(ZoneId.of("Asia/Shanghai"));
    System.out.println(zdt);
}
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之新的時(shí)間日期 API
作者:凌風(fēng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72779.html

相關(guān)文章

  • 樂(lè)字節(jié)-Java8特性之Date API

    摘要:上一篇文章,小樂(lè)給大家?guī)?lái)了新特性之,接下來(lái)本文將會(huì)給大家介紹新特性之前言通過(guò)發(fā)布新的來(lái)進(jìn)一步加強(qiáng)對(duì)日期與時(shí)間的處理。 上一篇文章,小樂(lè)給大家?guī)?lái)了Java8新特性之Optional,接下來(lái)本文將會(huì)給大家介紹Java8新特性之Date API 前言: Java 8通過(guò)發(fā)布新的Date-Time API來(lái)進(jìn)一步加強(qiáng)對(duì)日期與時(shí)間的處理。 舊版的 Java 中,日期時(shí)間 API 存在諸多問(wèn)題...

    suemi 評(píng)論0 收藏0
  • PHP 5.3向更高版本遷移之特性

    摘要:新特性掌握的引入,可以擴(kuò)展的內(nèi)容,使在某種形式上實(shí)現(xiàn)了多重繼承,更加靈活不能被實(shí)例化示例代碼需要注意的是,的繼承順序來(lái)自當(dāng)前類(lèi)的成員覆蓋了的方法,而則覆蓋了被繼承的方法當(dāng)多個(gè)被同一個(gè)類(lèi)使用的時(shí)候,會(huì)出現(xiàn)方法沖突的情況,使用關(guān)鍵詞解決示 PHP 5.4新特性 掌握 traits trait的引入,可以擴(kuò)展class的內(nèi)容,使class在某種形式上實(shí)現(xiàn)了多重繼承,更加靈活 t...

    macg0406 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第十二章筆記(日期時(shí)間API

    摘要:合并日期和時(shí)間這個(gè)復(fù)合類(lèi)名叫,是和的合體。截至目前,我們介紹的這些日期時(shí)間對(duì)象都是不可修改的,這是為了更好地支持函數(shù)式編程,確保線程安全,保持領(lǐng)域模式一致性而做出的重大設(shè)計(jì)決定。 新的日期和時(shí)間API Java的API提供了很多有用的組件,能幫助你構(gòu)建復(fù)雜的應(yīng)用。不過(guò),Java API也不總是完美的。我們相信大多數(shù)有經(jīng)驗(yàn)的程序員都會(huì)贊同Java 8之前的庫(kù)對(duì)日期和時(shí)間的支持就非常不理想...

    khlbat 評(píng)論0 收藏0
  • Java8特性日期處理

    摘要:處理日期日歷和時(shí)間的不足之處將設(shè)定為可變類(lèi)型,以及的非線程安全使其應(yīng)用非常受限。最完整的日期時(shí)間,包含時(shí)區(qū)和相對(duì)或格林威治的時(shí)差。獲取當(dāng)前的日期中的用于表示當(dāng)天日期。 簡(jiǎn)介 伴隨 lambda表達(dá)式、streams 以及一系列小優(yōu)化,Java 8 推出了全新的日期時(shí)間API。 Java處理日期、日歷和時(shí)間的不足之處:將 java.util.Date 設(shè)定為可變類(lèi)型,以及 SimpleD...

    Airy 評(píng)論0 收藏0
  • 聊聊 Java8 以后各個(gè)版本的特性

    摘要:于是抽時(shí)間看了看以后各個(gè)版本的特性,做了一個(gè)總結(jié)。年和公開(kāi)版本發(fā)布,取名為。此后對(duì)應(yīng)版本就是,。發(fā)布,是一個(gè)重大版本更新。在此之后,就是每六個(gè)月發(fā)布一次新版本。以上和參考資料聊了一些關(guān)于的歷史,下面我們看看各個(gè)版本有那些新特性。 【這是 ZY 第 11 篇原創(chuàng)技術(shù)文章】 某天在網(wǎng)上閑逛,突然看到有篇介紹 Java 11 新特性的文章,頓時(shí)心里一驚,畢竟我對(duì)于 Java 的版本認(rèn)識(shí)...

    K_B_Z 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<