Java8-LocalDateTime記錄

Java8-LocalDateTime記錄

文中都使用的時區都是東8區,也就是北京時間。這是爲了防止服務器設置時區錯誤時導致時間不對,如果您是其他時區,請自行修改。

關鍵類介紹

– Instant:它代表的是時間戳
– LocalDate:不包含具體時間的日期,比如2019-08-28。它可以用來存儲生日,週年紀念日,入職日期等。
– LocalTime:它代表的是不含日期的時間
– LocalDateTime:它包含了日期及時間,不過還是沒有偏移信息或者說時區。
– ZonedDateTime:這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間爲基準的。

Java8新增的DateTimeFormatter與SimpleDateFormat的區別

兩者最大的區別是,Java8的DateTimeFormatter是線程安全的,而SimpleDateFormat並不是線程安全。

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class Main {

    public static void main(String args[]){

        //解析日期
        String dateStr= "2016年10月25日";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        LocalDate date= LocalDate.parse(dateStr, formatter);

        //日期轉換爲字符串
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a");
        String nowStr = now .format(format);
        System.out.println(nowStr);

        //ThreadLocal來限制SimpleDateFormat
        System.out.println(format(new Date()));
    }

    //要在高併發環境下能有比較好的體驗,可以使用ThreadLocal來限制SimpleDateFormat只能在線程內共享,這樣就避免了多線程導致的線程安全問題。
    private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };

    public static String format(Date date) {
        return threadLocal.get().format(date);
    }

}

LocalDateTime獲取毫秒數

//獲取秒數
Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
//獲取毫秒數
Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();

LocalDateTime與String互轉

//時間轉字符串格式化
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
 String dateTime = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);

//字符串轉時間
String dateTimeStr = "2018-07-28 14:11:15";
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, df);

Date與LocalDateTime互轉

//將java.util.Date 轉換爲java8 的java.time.LocalDateTime,默認時區爲東8區
public static LocalDateTime dateConvertToLocalDateTime(Date date) {
    return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
}

//將java8 的 java.time.LocalDateTime 轉換爲 java.util.Date,默認時區爲東8區
public static Date localDateTimeConvertToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
}

/**
 * 測試轉換是否正確
 */
@Test
public void testDateConvertToLocalDateTime() {
    Date date = DateUtils.parseDate("2018-08-01 21:22:22", DateUtils.DATE_YMDHMS);
    LocalDateTime localDateTime = DateUtils.dateConvertToLocalDateTime(date);
    Long localDateTimeSecond = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
    Long dateSecond = date.toInstant().atOffset(ZoneOffset.of("+8")).toEpochSecond();
    Assert.assertTrue(dateSecond.equals(localDateTimeSecond));
}

參考

https://blog.csdn.net/u014044812/article/details/79231738

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章