Java8-LocalDateTime

365 阅读2分钟

简介

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也是线程安全的