概述
说到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);
}
上面列了一部分的用法,当然还有很多用法可以通过查阅文档去了解一下
最后
以上就是隐形店员为你收集整理的java日期还在用Date吗,jdk1.8的LocalDateTime不妨了解一下的全部内容,希望文章能够帮你解决java日期还在用Date吗,jdk1.8的LocalDateTime不妨了解一下所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复