java日期还在用Date吗,LocalDateTime不妨了解一下

说到java中的Date,大部分人应该都用过,我见到的项目中也都是使用Date(加上Calendar)来处理各种时间日期的。所以并没有对这个类产生过什么想法,后来看到有人推荐使用LocalDateTime来处理,然后看了下Date相关的一些使用,发现还有隐藏着一些问题的。

说到Date就不能不再说一下DateFormat,因为Date输出的日期(Fri Oct 25 10:01:03 CST 2019)可读性很差,所以必须进行格式化,转化成易读的日期格式,那么DateFormat就来了。

//Date转String
Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = df.format(date);

//String转Date
String dateStr = "2019-10-25 10:00:00";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = df.parse(dateStr);

上面的时间转换看起来很简单,但是这里面还隐藏着问题。SimpleDateFormat是线程不安全的,来看一下format()的源码

private StringBuffer format(Date date, StringBuffer toAppendTo,
                                FieldDelegate delegate) {
    // Convert input date to time field list
    calendar.setTime(date);

    boolean useDateFormatSymbols = useDateFormatSymbols();

    ......

看到这个方法的第一行 calendar.setTime(date),就会发现,calendar是在DateFormat类中的一个变量,并且没有做线程安全控制。如用static修饰的SimpleDateFormat调用format方法,多线程情况下,可能一个线程刚设置了time,另一个线程马上又修改了time,就会导致返回的时间错误。SimpleDateFormat的parse()方法同样也存在问题。

当然如果我们每次使用的时候都new一个SimpleDateFormat对象是可以避免上面那种情况的。只不过多次创建和销毁对象的开销会变大。

此时重点来了,jdk1.8中新提供了几个类:LocalDate、LocalTime、LocalDateTime。

public static void main(String[] args) throws ParseException{
	
    //年月日  
    LocalDate localDate = LocalDate.now();
    System.out.println(localDate);
    System.out.println(localDate.getYear()+"-"+localDate.getMonthValue()+
	    "-"+localDate.getDayOfMonth());
	
    //时分秒
    LocalTime localTime = LocalTime.now();
    System.out.println(localTime);
    System.out.println(localTime.getHour()+":"+localTime.getMinute()+
	    ":"+localTime.getSecond());
	
    //年月日时分秒
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime);
    System.out.println(localDateTime.getYear()+"-"+localDateTime.getMonthValue()+
	    "-"+localDateTime.getDayOfMonth()+" "+localDateTime.getHour()+
	    ":"+localDateTime.getMinute()+":"+localDateTime.getSecond());

    //创建指定日期
    LocalDate localDate1 = LocalDate.of(2019, 10, 10);

    //解析字符串创建
    LocalDate date = LocalDate.parse("2018-10-31");
    LocalTime time = LocalTime.parse("13:45:20");

    //合并日期和时间
    LocalDateTime localDateTime1 = LocalDateTime.of(date,time);

    //修改日期
    LocalDate localDate2 = LocalDate.of(2018, 10, 31);//2018-10-31
    LocalDate localDate3 = localDate2.withYear(2011);//2011-10-31
    LocalDate localDate4 = localDate2.withDayOfMonth(25);//2011-10-25

    //自定义格式化
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    //String和LocalDateTime互转
    String s1 = localDateTime1.format(dateTimeFormatter);
    LocalDateTime localDateTime2 = LocalDateTime.parse("2019-10-25 15:15:01",dateTimeFormatter);

}

上面列了一部分的用法,当然还有很多用法可以通过查阅文档去了解一下

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