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<DateFormat> threadLocal = new ThreadLocal() {
//        @Override
//        protected DateFormat initialValue() {
//            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        }
//    };

// 以上代码,等价于下面一段lambda表达式写法
private static ThreadLocal<DateFormat> 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


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏