简介
伴随 lambda表达式
、streams
以及一系列小优化,Java8 推出了全新的日期时间API。
Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。 然后就在 java8 上面增加新的特性。
全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)
、 长短(duration)
、日期
、时间
、时区
和周期
。
新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
编号 | 类的名称 | 描述 |
---|---|---|
1 | Instant | 时间戳 |
2 | Duration | 持续时间,时间差 |
3 | LocalDate | 只包含日期,比如:2020-01-15 |
4 | LocalTime | 只包含时间,比如:23:12:10 |
5 | LocalDateTime | 包含日期和时间,比如:2020-01-15 23:14:21 |
6 | Period | 时间段 |
7 | ZoneOffset | 时区偏移量,比如:+8:00 |
8 | ZonedDateTime | 带时区的时间 |
9 | Clock | 时钟,比如获取目前美国纽约的时间 |
关键类
- Instant:瞬时实例。
- LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
- LocalTime:本地时间,不包含日期。
- LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
- ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
实际使用
获取当前日期
Java 8 中的 LocalDate
用于表示当天日期。和 java.util.Date不同,它只有日期,不包含时间。当你仅需要表示日期时就用这个类。
LocalDate today = LocalDate.now();
获取年、月、日信息
//获取年、月、日信息
public void getDetailDate(){
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d t %n", year, month, day);
}
处理特定日期
通过静态工厂方法**now()**非常容易地创建了当天日期。
还可以调用另一个有用的工厂方法 LocalDate.of()
创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例**。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从 0
开始等等。日期所见即所得。
//处理特定日期
public void handleSpecilDate(){
LocalDate dateOfBirth = LocalDate.of(2018, 01, 21);
System.out.println("The specil date is : " + dateOfBirth);
}
判断两个日期是否相等
LocalDate
重载了equal方法
注意,如果比较的日期是字符型的,需要先解析成日期对象再作判断。
//判断两个日期是否相等
public void compareDate(){
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2018, 01, 21);
if(date1.equals(today)){
System.out.printf("TODAY %s and DATE1 %s are same date %n", today, date1);
}
}
检查像生日这种周期性事件
Java 中另一个日期时间的处理就是检查类似生日、纪念日、法定假日(国庆以及春节)、或者每个月固定时间发送邮件给客户 这些周期性事件。
Java中检查这些节日或其它周期性事件是使用MonthDay
类。这个类组合了月份和日,去掉了年,这意味着可以用它判断每年都会发生事件。
和这个类相似的还有一个YearMonth
类。这些类也都是不可变并且线程安全的值类型。
//处理周期性的日期
public void cycleDate(