目录
1 使用新时间日期API的必要性
在java8以前,或许:
- 当你在做有关时间日期的操作时,你会想到用Date;
- 当你在做日期、月份、天数相加减时,你会想到用Calendar;
- 当你需要对时间日期进行格式化时,你会想到使用SimpleDateFormat或DateFormat下的其他子类;
但是,你必须知道,以上有关的时间日期操作对象,都是可变的、线程不安全的,同时,如果作为一个经常写过类似代码的人来说,尽管有相关对象提供某些操作,但并不能很快、很简单的就能得到最终想要的结果,如:要计算两个时间点之间相差的年、月、日、周、时、分、秒等,这些计算尽管原有API也能够实现,但原有API除了线程不安全之外,另外一个不足之处就是代码繁琐,性能低!
为何我们总提多线程下,线程不安全?对于初学者来说,可能觉得能够简单实现出功能就已经足够,但是真正的开发项目是不可能仅仅考虑功能的实现的,还要考虑项目的安全性、稳定性、高性能、高可用性等等!因此,作为java开发者,多线程的知识是必不可少的。而也正因为多线程,才会出现一大堆问题(简称线程安全性问题),作为开发者,就应该写出不仅能实现功能的代码,还要是线程安全的代码。那么,学习并熟悉掌握新的线程安全的API就显得非常重要了!
没错,java8出的新的时间日期API都是线程安全的,并且性能更好,代码更简洁!
2 新时间日期API常用、重要对象介绍
LocalDate、LocalTime、LocalDateTime是新API里的基础对象,绝大多数操作都是围绕这几个对象来进行的,有必要搞清楚:
LocalDate : 只含年月日的日期对象
LocalTime :只含时分秒的时间对象
LocalDateTime : 同时含有年月日时分秒的日期对象
3 相关案例解析分析(重要)
3.1 获取当前时间:LocalDateTime date= LocalDateTime.now();
3.2 日期格式化
a、localDateTime格式化
String format = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
打印format:2020-10-10 15:15:10
b、LocalDate格式化
LocalDate now = LocalDate.now();// 当前时间
String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
打印format:2020-10-10
3.3 日期转换
a、日期转为字符串
String format = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
打印format:2020-10-10 15:15:10
b、字符串转为日期
String date= "2018-06-01 10:12:05";
LocalDateTime ldt = LocalDateTime.parse(date,DateTimeFormatter.ofPattern("yyyy-
MM-dd HH:mm:ss"));
打印结果:2018-06-01T10:12:05
LocalDateTime endTime = LocalDateTime.parse("2024-03-07 23:59:59", DatePattern.NORM_DATETIME_FORMATTER); // 结束时间
c、LocalDate转为Date
Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
d、Date转为LocalDate
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate转为LocalDateTimeString fora = "2024-01-16"; LocalDate localDate = LocalDateTimeUtil.parseDate(fora); LocalDateTime localDateTime = localDate.atTime(LocalTime.now());
3.4 日期相加减
相加
LocalDateTime plusDaysResult = date.plusDays(7L);//加天数
LocalDateTime plusYearsResult = date.plusYears(2L);//加年份
LocalDateTime plusMonthsResult = date.plusMonths(3L);//加月份
LocalDateTime plusHoursResult = date.plusHours(2L);//加小时
LocalDateTime plusMinutesResult = date.plusMinutes(10L);//加分钟数
LocalDateTime plusSecondsResult = date.plusSeconds(10L);//加秒数
相减
LocalDateTime plusDaysResult = date.minusDays(7L);//减天数
LocalDateTime plusYearsResult = date.minusYears(2L);//减年份
LocalDateTime plusMonthsResult = date.minusMonths(3L);//减月份
LocalDateTime plusHoursResult = date.minusHours(2L);//减小时
LocalDateTime plusMinutesResult = date.minusMinutes(10L);//减分钟数
LocalDateTime plusSecondsResult = date.minusSeconds(10L);//减秒数
3.5 日期比较
关键词:isAfter isBefore equals
isAfter:比较时间之后
isBefore :比较时间之前
equals:相等
案例:
LocalDateTime nowTime= LocalDateTime.now();
LocalDateTime endTime = LocalDateTime.of(2017, 10, 22, 10, 10, 10);
nowTime.isAfter(endTime); //比较 现在的时间 比 设定的时间 之后
nowTime.isBefore(endTime) // 现在的时间 比 设定的时间 之前
nowTime.equals(endTime) //比较 现在的时间 和 设定的时候 相等
3.6 其他
获取当月第一天
date.with(TemporalAdjusters.firstDayOfMonth());
获取当月最后一天
date.with(TemporalAdjusters.lastDayOfMonth());
LocalDateTime now = LocalDateTime.now();
System.out.println("当前年:"+now.getYear());
System.out.println("当前月:"+now.getMonthValue());
System.out.println("当前日:"+now.getDayOfMonth());
System.out.println("在本年第"+now.getDayOfMonth()+"日");
System.out.println("在本年第"+now.getDayOfMonth()+"星期");
LocalDateTime now = LocalDateTime.now(); //开始时间
LocalDateTime end = LocalDateTime.now();//最后时间
Duration duration = Duration.between(now,end);
long days = duration.toDays(); //相差的天数
long hours = duration.toHours();//相差的小时数
long minutes = duration.toMinutes();//相差的分钟数
long millis = duration.toMillis();//相差毫秒数
long nanos = duration.toNanos();//相差的纳秒数
..........................
4 日期转换工具类:
public static void main(String[] args) throws Exception{
// 1 日期转字符串
String NORM_DATETIME_PATTERN = DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN);
System.out.println(NORM_DATETIME_PATTERN);
String format = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN);
System.out.println(format);
}
5 重点推荐类:
DatePattern.java,可提供很多常量配置,如下: "yyyy-MM-dd"
"yyyy-MM-dd HH:mm"