Java8日期Api,看完你再也回不去了!

需求

需求: 給你一個(gè)時(shí)間格式(yyyy-MM-dd) 你給我返回這個(gè)時(shí)間前一個(gè)月的時(shí)間戳,前一天的時(shí)間戳,前一周的時(shí)間戳

我:????

Java8的新API你用了,你會(huì)發(fā)現(xiàn)你再也回不去了?

不多說上代碼

/**
 * @author :hujiansong
 * @date :2019/6/24 17:59
 * @since :1.8
 */
public class NewDateTimeAPI {

    private static long getTimestamp(String dateText){
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 解析成java8 日期
        LocalDate parse = LocalDate.parse(dateText, pattern);
        // 解析成java8 日期時(shí)間(只有日期時(shí)間才有時(shí)間戳)
        LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
        // 轉(zhuǎn)換成時(shí)間戳
        return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    }


    public static void main(String[] args) {
        long lastMonthTimestamp = getTimestamp("2018-11-12");
        System.out.println(lastMonthTimestamp);
    }
}

可以看到很簡(jiǎn)單:

主要是三步:

  1. 格式化成日期
  2. 日期變成日期時(shí)間
  3. 日期時(shí)間通過atZone()確定時(shí)區(qū),轉(zhuǎn)換成Instant,最后轉(zhuǎn)換成時(shí)間戳

接下來騷操作來了。

獲取上一個(gè)月時(shí)間戳:

    private static long getLastMonthTimestamp(String dateText){
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 解析成java8 日期
        LocalDate parse = LocalDate.parse(dateText, pattern);
        // 解析成java8 日期時(shí)間(只有日期時(shí)間才有時(shí)間戳)
        LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));

        // 獲取上一個(gè)月時(shí)間戳
        dateTime = dateTime.minusMonths(1);

        // 轉(zhuǎn)換成時(shí)間戳
        return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    }

只需要加一行代碼 dateTime.minusMonths(1);

同理,相同的獲取前一天,前一周,具體調(diào)用不同的方法。

minusDays()
minusHours()
minusMinutes()
minusSeconds()

最騷的還有一個(gè),就是可以指定特定的時(shí)間:

    private static long specialDate(String dateText) {
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 解析成java8 日期
        LocalDate parse = LocalDate.parse(dateText, pattern);
        // 解析成java8 日期時(shí)間(只有日期時(shí)間才有時(shí)間戳)
        LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));

        // 獲取當(dāng)前日期的12點(diǎn)0分0秒的時(shí)間戳
        dateTime = dateTime.withHour(12)
                .withMinute(0)
                .withSecond(0);

        // 轉(zhuǎn)換成時(shí)間戳
        return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    }

獲取特定小時(shí)分鐘秒的時(shí)間戳。

withHour()
withMinute()
withSecond()

時(shí)間戳轉(zhuǎn)換為特定格式日期

    public static String ts2Str(long second){
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(second), ZoneId.systemDefault());
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = localDateTime.format(pattern);
        return format;
    }

時(shí)間戳轉(zhuǎn)換為Instant,然后從Instant轉(zhuǎn)換為LocalDateTime,最后format即可。

總結(jié)

時(shí)間戳轉(zhuǎn)日期:使用Instant.ofEpochSecond()轉(zhuǎn)換為 Instant,然后調(diào)用LocalDateTime.ofInstant()獲取時(shí)間日期對(duì)象

注意:時(shí)間戳只能針對(duì)LocalDateTime,LocalDate是不具備時(shí)間戳的。

LocalDate要想轉(zhuǎn)成可以采用LocalDateTime,可以調(diào)用LocalDateTime.of(localDate, LocalTime.of(0, 0));

字符串轉(zhuǎn)日期:如果是yyyy-MM-dd時(shí)間格式,那么采用LocalDate.parse(),如果是yyyy-MM-dd HH:mm:ss那么采用LocalDateTime.parse()

轉(zhuǎn)換成了LocalDateTime或者LocalDate那么就可以調(diào)用具體的方法,去操作日期了。你就會(huì)發(fā)現(xiàn)你再也回不去了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容