天天看點

java date dateformat_Java8中DateTimeFormatter與SimpleDateFormat的差別

java date dateformat_Java8中DateTimeFormatter與SimpleDateFormat的差別

DateTimeFormatter

Java8之前的時間和日期API并不好用,而且線上程安全性等方面也存在問題,一般會借助一些開源類庫來解決時間處理的問題。在JDK1.8中新加入了時間和日期的API, 借助這些新的API基本可以不再需要開源類庫的幫助來完成時間的處理了。

Java8中加入了LocalDateTime, LocalDate, LocalTime, Duration, Period, Instant, DateTimeFormatter等等API,來看一些使用這些API的簡單的例子://建立日期

LocalDate date = LocalDate.of(2017,1,21); //2017-01-21

int year = date.getYear() //2017

Month month = date.getMonth(); //JANUARY

int day = date.getDayOfMonth(); //21

DayOfWeek dow = date.getDayOfWeek(); //SATURDAY

int len = date.lengthOfMonth(); //31(days in January)

boolean leap = date.isLeapYear(); //false(not a leap year)

//時間的解析和格式化

LocalDate date = LocalDate.parse("2017-01-21");

LocalTime time = LocalTime.parse("13:45:20");

LocalDateTime now = LocalDateTime.now();

now.format(DateTimeFormatter.BASIC_ISO_DATE);

//合并日期和時間

LocalDateTime dt1 = LocalDateTime.of(2017, Month.JANUARY, 21, 18, 7);

LocalDateTime dt2 = LocalDateTime.of(localDate, time);

LocalDateTime dt3 = localDate.atTime(13,45,20);

LocalDateTime dt4 = localDate.atTime(time);

LocalDateTime dt5 = time.atDate(localDate);

//操作日期

LocalDate date1 = LocalDate.of(2014,3,18); //2014-3-18

LocalDate date2 = date1.plusWeeks(1); //2014-3-25

LocalDate date3 = date2.minusYears(3); //2011-3-25

LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS); //2011-09-25

// 其他示例

LocalDate dNow = LocalDate.now();

System.out.println(dNow);       //  2017-10-24

LocalTime tNow = LocalTime.now();

System.out.println(tNow);       // 11:59:44.023

LocalDateTime now = LocalDateTime.now();

System.out.println(now);        // 2017-10-24T11:59:44.024

DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd");

System.out.println(df.format(LocalDateTime.now()));     //  2017/10/24

System.out.println(LocalDate.parse("2016/11/28", df));  // 2016-11-28

DateTimeFormatter nTZ = DateTimeFormatter.ofPattern("d MMMM, yyyy h:mm a");

System.out.println(ZonedDateTime.now().format(nTZ));        // 24 十月, 2017 11:59 上午

可以發現,新的時間和日期API都是不可變的,并且是線程安全的,之前使用的比如SimpleDateFormat不是線程安全的, 現在可以使用DateTimeFormatter來代替,DateTimeFormatter是線程安全的。

以上隻是Java8提供的新時間和日期API的一部分,更多的内容可以參考官網文檔,有了這些API,相信完全可以不再依賴開源的類庫來進行時間的處理。

與SimpleDateFormat兩者最大的差別是,Java8的DateTimeFormatter是線程安全的,而SimpleDateFormat并不是線程安全。public static void main(String args[]) {

//解析日期

String dateStr = "2017年10月24日";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");

LocalDate date = LocalDate.parse(dateStr, formatter);

System.out.println(date);

//日期轉換為字元串

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 threadLocal = new ThreadLocal() {

//        @Override

//        protected DateFormat initialValue() {

//            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//        }

//    };

// 以上代碼,等價于下面一段lambda表達式寫法

private static ThreadLocal threadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

public static String format(Date date) {

return threadLocal.get().format(date);

}

運作結果2017-10-24

2017年10月24日 01:16 下午

2017-10-24 13:16:34