Java 8 日期、时间操作
真放肆不在饮酒放荡,假矜持偏要慷慨激昂。万事留一线,江湖好相见–老郭经典语录
本篇描述LocalDate、LocalTime、LocalDateTime、TemporalAdjuster
基本API
的使用
一、概述
在Java8之前,日期时间API一直被开发者疯狂吐槽。
槽点一:java.util.Date是可变类型
槽点二:SimpleDateFormat非线程安全。。。
So 它来了Java8引入了一套全新的日期时间处理API,新的API基于ISO-8601标准日历系统。
LocalDate、LocalTime、LocalDateTime 类是不可变的对象,分别表示使用ISO-8601日期日历系统的日期、时间、日期和时间
TemporalAdjuster 时间矫正器
注:ISO-8601日历系统是国际标准化组织指定的现代公民的日期和时间的表示法
二、初识 LocalDate
Java 8中的LocalDate
用于表示当天日期。和java.util.Date
不同,它只有日期,不包含时间。
eg1: 获取当天日期
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println("当前日期=" + date); // 当前日期=2020-05-11
}
eg2: 构造指定日期
调用工厂方法LocalDate.of()
创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate
实例。
这个方法摒弃了以前API
的头疼时间,比如年度起始于1900,月份是从0开始。。。
public static void main(String[] args) {
LocalDate date = LocalDate.of(2000, 1, 1);
System.out.println("LocalDate=" + date); // LocalDate=2000-01-01
}
eg3: 获取年月日信息
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.printf("%d年,%d月,%d日", date.getYear(),
date.getMonthValue(), date.getDayOfMonth()); // 2020年,5月,11日
}
eg4: 比较两个日期是否相等
public static void main(String[] args) {
LocalDate now = LocalDate.now();
LocalDate date = LocalDate.of(2018, 9, 24);
System.out.println("日期是否相等=" + now.equals(date));
}
三、初识-LocalTime
Java 8中的 LocalTime
用于表示当天时间。和java.util.Date
不同,它只有时间,不包含日期。
eg1: 获取当前时间
public static void main(String[] args) {
LocalTime time = LocalTime.now();
System.out.println("当前时间=" + time); // 当前时间=00:17:19.648
System.out.printf("%d时,%d分,%d秒", time.getHour(),time.getMinute() ,time.getSecond());// 0时,19分,38秒
}
四、比较与计算
Java 8提供了新的plusXxx()
方法用于计算日期时间增量值,替代了原来的add()
方法。新的API
将返回一个全新的日期时间示例,需要使用新的对象进行接收。
eg1: 日期时间计算
public static void main(String[] args) {
// 时间增量
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // 当前时间往前推2个小时
System.out.println("newTime=" + newTime);
// 日期增量
LocalDate date = LocalDate.now();
LocalDate newDate = date.plus(1, ChronoUnit.WEEKS); // 当前日期往前推一周
System.out.println("newDate=" + newDate);
}
Java 8 提供了isAfter()
、isBefore()
用于判断当前日期时间和指定日期时间的比较
eg2: 日期时间比较
public static void main(String[] args) {
LocalDate now = LocalDate.now();
LocalDate dateOld = LocalDate.of(2000, 1, 1);
if (now.isAfter(dateOld)) {
System.out.println("2000已经过去了");
}
LocalDate dateNew = LocalDate.of(2021, 1, 1);
if (now.isBefore(dateNew)) {
System.out.println("2021年还未到来");
}
}
五、时区
Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如ZoneId
来处理特定时区,ZoneDateTime
类来表示某时区下的时间。
eg: 创建带有时区的日期时间
public static void main(String[] args) {
// 上海时间
ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId);
// 东京时间
ZoneId tokyoZoneId = ZoneId.of("Asia/Tokyo");
ZonedDateTime tokyoZonedDateTime = ZonedDateTime.now(tokyoZoneId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("上海时间: " + shanghaiZonedDateTime.format(formatter));
System.out.println("东京时间: " + tokyoZonedDateTime.format(formatter));
}
六、格式化
eg1: 使用预定义格式解析与格式化日期
public static void main(String[] args) {
// 解析日期
String dateText = "20180924";
LocalDate date = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE);
System.out.println("格式化之后的日期=" + date);
// 格式化日期
dateText = date.format(DateTimeFormatter.ISO_DATE);
System.out.println("dateText=" + dateText);
}
eg2:日期和字符串的相互转换
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 日期时间转字符串
LocalDateTime now = LocalDateTime.now();
String nowText = now.format(formatter);
System.out.println("nowText=" + nowText);
// 字符串转日期时间
String datetimeText = "1999-12-31 23:59:59";
LocalDateTime datetime = LocalDateTime.parse(datetimeText, formatter);
System.out.println(datetime);
}
LocalDateTime与上述用法大致相同不予冗余
七、初始-TemporalAdjuster
有时我们可能需要获取例如:将日期调整到“下个周日”等cz
TemporalAdjusters
:该类通过静态方法提供了大量的常用TemporalAdjuster
的实现
public static void main(String[] args) {
LocalDate date = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(date);
}
七、相关类说明
Instant // 时间戳
Duration // 持续时间、时间差
LocalDate // 只包含日期,比如:2018-09-24
LocalTime // 只包含时间,比如:10:32:10
LocalDateTime // 包含日期和时间,比如:2018-09-24 10:32:10
Peroid // 时间段
ZoneOffset // 时区偏移量,比如:+8:00
ZonedDateTime // 带时区的日期时间
Clock // 时钟,可用于获取当前时间戳
java.time.format.DateTimeFormatter //时间格式化类
TemporalAdjuster // 矫正器