一、概要
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:
-
非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
-
设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
-
时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
-
Local(本地) − 简化了日期时间的处理,没有时区的问题。
-
Zoned(时区) − 通过制定的时区处理日期时间。
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。
- Instant——它代表的是时间戳
- LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
- LocalTime——它代表的是不含日期的时间
- LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
- ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
二、LocalDate
2.1创建LocalDate的方式有很多种,这里介绍几种最常用的方式:
- LocalDate now = LocalDate.now(); // 无参当前时间 // 输出2019-01-15
- LocalDate of = LocalDate.of(2019, 1, 15); // 分别传递 年 月 日创建 // 输出2019-01-15
- LocalDate parse = LocalDate.parse("2019-01-15"); // 传递日期字符串 // 输出2019-01-15
- LocalDate parse1 = LocalDate.parse("2019/01/15", DateTimeFormatter.ofPattern("yyyy/MM/dd")); // 按指定格式创建日期 // 输出2019-01-15
2.2LocalDate常用方法总结
- getYear() int 获取当前日期的年份
- getMonth() Month 获取当前日期的月份对象
- getMonthValue() int 获取当前日期是第几月
- getDayOfWeek() DayOfWeek 表示该对象表示的日期是星期几
- getDayOfMonth() int 表示该对象表示的日期是这个月第几天
- getDayOfYear() int 表示该对象表示的日期是今年第几天
- withYear(int year) LocalDate 修改当前对象的年份
- withMonth(int month) LocalDate 修改当前对象的月份
- withDayOfMonth(intdayOfMonth) LocalDate 修改当前对象在当月的日期
- isLeapYear() boolean 是否是闰年
- lengthOfMonth() int 这个月有多少天
- lengthOfYear() int 该对象表示的年份有多少天(365或者366)
- plusYears(longyearsToAdd) LocalDate 当前对象增加指定的年份数
- plusMonths(longmonthsToAdd) LocalDate 当前对象增加指定的月份数
- plusWeeks(longweeksToAdd) LocalDate 当前对象增加指定的周数
- plusDays(longdaysToAdd) LocalDate 当前对象增加指定的天数
- minusYears(longyearsToSubtract) LocalDate 当前对象减去指定的年数
- minusMonths(longmonthsToSubtract) LocalDate 当前对象减去注定的月数
- minusWeeks(longweeksToSubtract) LocalDate 当前对象减去指定的周数
- minusDays(longdaysToSubtract) LocalDate 当前对象减去指定的天数
- compareTo(ChronoLocalDateother) int 比较当前对象和other对象在时间上的大小,返回值如果为正,则当前对象时间较晚,
- isBefore(ChronoLocalDateother) boolean 比较当前对象日期是否在other对象日期之前
- isAfter(ChronoLocalDateother) boolean 比较当前对象日期是否在other对象日期之后
- isEqual(ChronoLocalDateother) boolean 比较两个日期对象是否相等
- atTime(LocalTime time) LocalDateTime 转换成 LocalDateTime
2.3 通用的 增加 日期的方法
plus(long amountToAdd, TemporalUnit unit) LocalDate 按照后面给定字段添加指定数量的日期
LocalDate now = LocalDate.now(); // 2019-01-15
LocalDate plusDate = now.plus(4, ChronoUnit.YEARS); //添加数量4 添加字段 年
System.out.println(plusDate);
// 2023-01-15
2.4将日期转成字符串
format (DateTimeFormatter formatter) String 传递一个格式化器
LocalDate now = LocalDate.parse("2019/01/15", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
String plusDate = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(plusDate);
// 2019年01月15日
2.5 计算日期的间隔
until(Temporal endExclusive, TemporalUnit unit) long 传一个日期对象 和 间隔类型
public static void main(String[] args) {
LocalDate now = LocalDate.now(); // 2019-01-15
LocalDate of = LocalDate.of(1989, 07, 02);
long until = now.until(of, ChronoUnit.MONTHS); // 间隔 月
System.out.println(until);
// -354
}
三、LocalDate 和 Date的相互转换
3.1LocaLDate -> Date 的过程是LocaLDate -> ZonedDateTime -> Instant -> Date
public static void main(String[] args) {
LocalDate now = LocalDate.now();
ZonedDateTime zdt = now.atStartOfDay(ZoneId.systemDefault());
Instant instant = zdt.toInstant();
Date from = Date.from(instant);
}
3.2 Date -> LocalDate 的过程是和上面相反 Date -> Instant -> ZoneDateTime -> LocalDate
public static void main(String[] args) {
Date date = new Date();
Instant instant = date.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate localDate = zdt.toLocalDate();
}
四、LocalTime
4.1创建LocalTime的方式有很多种,这里介绍几种最常用的方式:
- LocalTime now = LocalTime.now(); //输出15:30:05.723
- LocalTime of = LocalTime.of(15, 30, 05);//输出15:30:05
- LocalTime parse = LocalTime.parse("15:30:05");//输出15:30:05
- LocalTime parse1 = LocalTime.parse("15时30分05", DateTimeFormatter.ofPattern("HH时mm分ss"));//输出15:30:05
4.2 LocalTime常用方与LocatDate的同名方法作用相同,只是区分出LocatTime仅仅是操作时间的就行。
4.3 LocalTime 转 LocalDateTime
LocalDateTime atDate (LocalDate date) // 传递一个LocalDate可转成LocalDateTIme
五、LocalDateTime
5.1创建LocalDateTIme的方式有很多种,这里介绍几种最常用的方式:
- LocalDateTime now = LocalDateTime.now(); // 输出 2019-01-15T15:48:00.822
- LocalDateTime of = LocalDateTime.of(2019, 1, 05, 15, 45, 40); //输出 2019-01-05T15:45:40
- LocalDateTime parse = LocalDateTime.parse("2019-01-05T15:45:40"); //输出 2019-01-05T15:45:40
- LocalDateTime parse1 = LocalDateTime.parse("2019-01-05 15:45:40", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); //输出 2019-01-05T15:45:40
5.2 LocalDateTIme常用方与LocatDate的同名方法作用相同,LocalDateTIme可以获取所有的字段信息,并且可以转换成LocalDate和LocalTime。
大部分使用的方法几乎都在上面了,其他Time相关API可以在使用的时自行查找。
(完)