前段时间学校教Java常用类库,学到日期的时候,我差点吐了一口老血。。。
先来看看我遭遇了什么吧:
import java.util.Date;
public class DateDome {
public static void main(String[] args) {
Date date = new Date();
System.out.println("当前时间:" + date);
System.out.println("当前年份:" + date.getYear());
System.out.println("当前月份:" + date.getMonth());
/*
当前时间:Thu Apr 23 18:08:46 CST 2020
当前年份:120
当前月份:3
当前日期:23
本人写这篇博客的时间是:2020年4月23日
*/
}
}
当时我在做一个类似于输出日期的作业,这真是令人有点窒息了。无奈我只能SimpleDateFormat一下。
为了究其原因,我就去查了一下api,简单看一下这个类中的方法,我发现令人震惊的一幕:
这总共才几个方法啊,就已经被弃用6个了。。。更过分的是:
连构造方法都被弃用一个了,合着我跟着学校学了一个被弃用的类?
更令人我无法忍受的是,当我尝试着使用Date类自定义一个日期的时候:
import java.util.Date;
public class DateDome {
public static void main(String[] args) {
Date date = new Date(2020,1,12);
System.out.println("当前时间:" + date);
/*
当前时间:Thu Feb 12 00:00:00 CST 3920
*/
}
}
这是不是意味着如果我要自定义时间还需要提前计算一下?
这属实太麻烦了,不过一想到学校用的还是jdk6,我就能理解学校为什么教这个类了。
那么现在最流行的jdk8有没有更好的解决方法呢?这不是必须的嘛,作为一个文化人,我今天给大家介绍在学校遇不到的LocalDate和LocalDateTime类
import java.time.LocalDate;
public class DateDome {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println("当前时间:" + date);
System.out.println("当前年份:" + date.getYear());
System.out.println("当前月份:" + date.getMonth());
System.out.println("当前日:" + date.getDayOfMonth());
/*
当前时间:2020-04-23
当前年份:2020
当前月份:APRIL
当前日:23
*/
}
}
但是似乎也有一个不太好的地方,就是不能获取时、分、秒,这就有点糟心了。。。
莫着急,让我们来瞅瞅LocalDateTime类:
import java.time.LocalDateTime;
public class DateDome {
public static void main(String[] args) {
LocalDateTime date = LocalDateTime.now();
System.out.println("当前时间:" + date);
System.out.println("当前年份:" + date.getYear());
System.out.println("当前月份:" + date.getMonth());
System.out.println("当前日:" + date.getDayOfMonth());
System.out.println("当前时:" + date.getHour());
System.out.println("当前分:" + date.getMinute());
System.out.println("当前秒:" + date.getSecond());
/*
当前时间:2020-04-23T19:04:53.640
当前年份:2020
当前月份:APRIL
当前日:23
当前时:19
当前分:4
当前秒:53
*/
}
}
那么自定义日期是不是类似的方便呢?瞅瞅下面的东西 :
LocalDateTime date = LocalDateTime.of(2020,10,20,10,20,10,20);
最牛逼的直接精确到纳秒
看到这里我琢磨着屏幕前的你对LocalDateTime类就了解的差不多了,下面直接来看代码:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import static java.time.format.DateTimeFormatter.ISO_DATE;
public class DateDome {
public static void main(String[] args) {
//创建一个2020年4月23日19时16分的时间
LocalDateTime date = LocalDateTime.of(2020,4,23,19,16);
//减去一年
date = date.minusYears(1);
//增加一个月
date = date.plusMonths(1);
/*其他的也类似,下面高能*/
date = date.withYear(2050);//直接将年份修改到2050年
/*当然最常规的格式化操作也少不了*/
String dateFormat = date.format(ISO_DATE);
/*当然他也可以把字符串转换成时间,如果想格式化日期,就是用LocalDate*/
String str = "1987-04-23 19:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
System.out.println(dateTime);
}
}
你以为这就完了?
太天真了大学生
我们可以在源代码中看到,对于LocalDate和LocalDateTime都有同一句描述:
线程安全!!!
线程安全!!!
线程安全!!!
这是Date类所不能比拟的最大的优势!!!
那么对于格式化类DateTimeFormatter呢?
线程安全! 这又是SimpleDateFormat所不能比拟的。要知道SimpleDateFormat是Date类对象格式化的途径啊!!
一言以蔽之,在LocalDate和LocalDateTime两个类里头,你可以放飞自我,完全不用担心线程不安全!
看到这里你还会执意的使用Date嘛?
如果以后我要是看见谁用了Date,我只能这么回复他
用了LocalDate和LocalDateTime,咱们都是