简介
Java8之前,时间都是使用Date类,但Date类缺点太多,使用起来很麻烦。
- 难以读懂返回的结果
public class BigDecimalStudy {
public static void main(String[] args) {
Date date = new Date();
System.out.println("当前时间" + date); // 当前时间Mon Dec 30 17:22:22 CST 2019
System.out.println("年份" + date.getYear()); // 年份119
System.out.println("月份" + date.getMonth()); // 月份11
}
}
- 太多的方法已被弃用,构造函数也被弃用
Java8的LocalDateTime很好的解决了这个问题
LocalDateTime
- 获取当前时刻非常直观
public class BigDecimalStudy {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前时间: " + localDateTime);
System.out.println("年: " + localDateTime.getYear());
System.out.println("月: " + localDateTime.getMonth());
System.out.println("日: " + localDateTime.getDayOfMonth());
System.out.println("时: " + localDateTime.getHour());
System.out.println("分: " + localDateTime.getMinute());
System.out.println("秒: " + localDateTime.getSecond());
}
}
结果为:
当前时间: 2019-12-30T17:55:22.574
年: 2019
月: DECEMBER
日: 30
时: 17
分: 55
秒: 22
- 构造一个指定的日期非常方便
public class BigDecimalStudy {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2019, Month.DECEMBER, 12, 8, 12, 12);
System.out.println(localDateTime);
}
}
- 修改日期也非常的方便
public class BigDecimalStudy {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2019, Month.DECEMBER, 12, 8, 12, 12);
System.out.println(localDateTime.minusYears(1)); // 减少一年 2018-12-12 08:12:12
System.out.println(localDateTime.plusDays(1)); // 增加一天 2018-12-13 08:12:12
System.out.println(localDateTime.withYear(2020)); // 直接修改年份 2020-12-13 08:12:12
}
}
- 格式化日期
public class BigDecimalStudy {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
String result1 = localDateTime.format(DateTimeFormatter.ISO_DATE);
String result2 = localDateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
String result3 = localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/DD"));
System.out.println(result1); // 2020-01-01
System.out.println(result2); // 20200101
System.out.println(result3); // 2020/01/01
}
}
- 时间反解析
public class BigDecimalStudy {
public static void main(String[] args) {
LocalDateTime time = LocalDateTime.parse("2019--12--12 11:12", DateTimeFormatter.ofPattern("yyyy--MM--dd HH:mm"));
System.out.println(time); // 2019-12-12T11:12
}
}
Date和LocalDateTime的转换
/**
* java.util.Date --> java.time.LocalDateTime
*
* @param date Date
* @return LocalDateTime
*/
public static LocalDateTime dateToLocalDateTime(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
/**
* java.time.LocalDateTime --> java.util.Date
*
* @param localDateTime LocalDateTime
* @return Date
*/
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
线程安全性问题
- Date时间类是可变类,线程不安全,SimpleDateFormat也是线程不安全的
- LocalDateTime是线程安全的,DateTimeFormatter也是线程安全的