java的Date类在早期版本中确实存在多个问题,主要表现在以下几个方面:
为了解决这些问题,Java 8引入了新的日期和时间API,包括LocalDateTime、Instant、DateTimeFormatter等类。这些新类不仅解决了Date类存在的问题,还提供了更多功能和更好的性能。
format() 方法用于将 LocalDateTime 对象格式化成字符串,其语法如下:
public String format(DateTimeFormatter formatter)
其中,formatter 表示日期时间格式化对象。
例如,以下代码将一个 LocalDateTime 对象格式化成 “yyyy-MM-dd HH:mm:ss” 格式的字符串:
LocalDateTime dateTime = LocalDateTime.of(2024, 01, 03, 14, 30, 0, 0);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String strDate = dateTime.format(formatter);
加减语法很简单,加plus,减为minus。举例:
LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1); // 加一天
LocalDateTime yesterday = now.minusDays(1); // 减一天
LocalDateTime nextMonth = now.plusMonths(1); // 加一个月(不考虑天数)
LocalDateTime lastMonth = now.minusMonths(1); // 减一个月(不考虑天数)
LocalDateTime lastMinute = now.minusMinutes(10); // 减一个月(不考虑天数)
System.out.println("现在:" + now);
System.out.println("明天:" + tomorrow);
System.out.println("昨天:" + yesterday);
System.out.println("下个月:" + nextMonth);
System.out.println("上个月:" + lastMonth);
System.out.println("减去10分钟:" + lastMinute);
Java 8中的Duration类表示两个时间点之间的持续时间,例如两个日期或时间戳之间的差异。它提供了一些方法来计算持续时间的长度,如获取天数、小时数、分钟数和秒数等。
Duration类是java.time包中的一部分,它是不可变的,因此可以在多线程环境中安全地使用。它提供了许多有用的方法,如:
LocalDateTime start = LocalDateTime.of(2024, 1, 1, 0, 0);
LocalDateTime end = LocalDateTime.of(2024, 1, 3, 0, 0);
Duration duration = Duration.between(start, end);
Duration pt10H = Duration.parse("-PT10H");
System.out.println(pt10H.toMinutes());
System.out.println("间隔时间为:"
+ duration.toDays() + "天"
+ duration.toHours() + "小时"
+ duration.toMinutes() + "分钟");
with方法可以理解为替换操作,比如替换小时:
LocalDateTime end = LocalDateTime.of(2024, 1, 3, 0, 0);
System.out.println(end.withHour(2)); //2024-01-03T02:00
替换为当月第一天:
LocalDateTime end = LocalDateTime.of(2024, 1, 3, 0, 0);
System.out.println(end.withDayOfMonth(1)); //2024-01-01T02:00
需要借助系统默认时区的ZonedDateTime对象,ZoneId.systemDefault()表示获取系统默认的时区:
LocalDateTime end = LocalDateTime.of(2024, 1, 3, 0, 0);
ZonedDateTime zonedDateTime = end.atZone(ZoneId.systemDefault());
Instant instant = zonedDateTime.toInstant();
System.out.println(instant.toEpochMilli());
当然,我们知道中国地区时间为utc+8小时,所以我们也可以直接指定,代码:
LocalDateTime end = LocalDateTime.of(2024, 1, 3, 0, 0);
System.out.println(end.toInstant(ZoneOffset.of("+08:00")).toEpochMilli());
compareTo() 方法用于比较两个 LocalDateTime 对象的顺序大小,如果当前对象在参数对象之前,则返回负数,如果当前对象在参数对象之后,则返回正数,如果两个对象相等,则返回 0。
例如,以下代码比较两个 LocalDateTime 对象的顺序:
LocalDateTime dateTime1 = LocalDateTime.of(2023, 01, 01, 14, 30, 0, 0);
LocalDateTime dateTime2 = LocalDateTime.of(2024, 01, 01, 14, 30, 0, 0);
int result = dateTime1.compareTo(dateTime2); // -1
本文从 LocalDateTime 类的创建、转换、格式化与解析、计算与比较以及其他操作几个方面详细介绍了 LocalDateTime 类在 Java 8 中的使用。掌握 LocalDateTime 类的使用可以大大提高日期时间处理效率和质量,理解在不通过引用其他三方jar的情况下JAVA自身就有很好的操作方式,希望本文对读者有所帮助。