Java
JDK8新增日期类
- 概述
- Java 8 开始,java.time包提供了新的日期和时间API,主要设计的类型有:
- JDK 8 新增日期类
- LoacalDate:不包含具体的时间和日期
- LocalTime:不含日期的时间
- LocalDateTime : 包含了日期及时间.
- Instant : 代表的是时间戳
- DureTimeFormatter 用于做时间的格式化和解析的
- Duration : 用于计算两个"时间"间隔
- Period : 用于计算两个"日期"间隔
- 新增的API严格区分了时刻.本地时间,并且,对日期和时间进行运算更加方便
- 其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改.
LocalDate,LocalTime,LocalDateTime
- team分别表示日期,时间,日期时间对象,他们的类的实例是不可改变的对象
- 他们三者构建对象和API都是通用的
构建对象的方式
方法名 | 说明 | |
---|---|---|
public static xxxx now(); | 静态方法,根据当前时间创建对象 | LocalDate LocalDate = LocalDate.now(); |
public static xxxx of(); | 静态方法,指定日期/时间创建对象 | LocalDate LocalDate = LocalDate.now(); |
三者方法相近,用法相同
获取信息的API
方法名 | 说明 |
---|---|
public int getYear() | 获取年 |
public int getMonthValue() | 获取月份(1-12) |
public int getDayOfMonth | 获取月中第几天乘法 |
public int getDayOfYear() | 获取年中第几天 |
public DayOfWeek getDayOfWeek() | 获取星期 |
转相关的API
-
LocalDateTime可以转换成LocalDate 和LocalTime
-
方法名 说明 public LocalDate toLocalDate() 转换成一个LocalDate对象 public LocalTime toLocalTime() 转换成一个LocalTime对象 -
LocalDateTime综合了LocalDate 和 LocalTime 里面的方法,
-
这些方法返回的是一个新的实例引用,业务LocalDateTime , LocalDate , LocalTime都是不可变的
-
方法名 说明 plusDays,plusWeeks,plusMonths,plusYears 向当前LocalDate对象添加几天,几周,几个月,几年 minusDays,minusWeeks,minusMonths,minusYeats 从当前LocakDate对象减去几天,几周,几个月,几年 withDayOfMonth,withDayOfYear,withMonth,withYear 将月份天使,年份天数,月份,年份,修改为指定的值并返回新的LocalDate对象 isBefore ,isAfter 比较两个LocalDate
Instant时间戳
-
JDK8获取时间戳特别简单,且功能丰富.Instant类由一个静态的工厂方法now()可以返回当前时间戳
package com.yu.SingleInstance; import java.time.Instant; import java.util.Date; public class InstantTest { public static void main(String[] args) { Instant instant = Instant.now(); System.out.println("当前时间是:"+instant); Date date = Date.from(instant); System.out.println("当前时间是:"+date); instant = date.toInstant(); System.out.println(instant); } }
- 运行结果
- com.yu.SingleInstance.InstantTest
当前时间是:2022-05-14T09:21:17.980Z
当前时间是:Sat May 14 17:21:17 CST 2022
2022-05-14T09:21:17.980Z
-
时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类是JDK8以前的Date
-
Instant和Date这两个类可以进行转换
DateTimeFormatter
日期时间格式化
-
在JDK8中,引入一个全新的日期与时间格式期DateTimeFormantter
-
正反都能调用format方法
-
package com.yu.SingleInstance; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class DateTimeFormatTest { public static void main(String[] args) { //本地此刻 日期时间 对象 LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); //解析/格式化器 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a"); //正向格式化 System.out.println(dtf.format(ldt)); //反向格式化 System.out.println(ldt.format(dtf)); //解析字符串时间 DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //解析指定时间字符串成为本地日期时间对象 LocalDateTime ldt1 =LocalDateTime.parse("2019-11-11 11:11:11",dtf1); System.out.println(ldt1); System.out.println(ldt1.getDayOfYear()); System.out.println(ldt1.getDayOfMonth()); System.out.println(ldt1.getDayOfWeek()); } }
-
结果
2022-05-14T17:35:53.979
2022-05-14 17:35:53 星期六 下午
2022-05-14 17:35:53 星期六 下午
2019-11-11T11:11:11
315
11
MONDAY
Duration/Period
Period
- 在Java 8 中,我们可以使用以下类来计算日期间隔差异:java.time.Period
- 主要是Period类的方法getYears(),getMonthos()和getDays() 来计算,只能精确到年月日
- 用于LocalDate之间的比较
Duration
用于计算两个"时间"间隔
package com.yu.SingleInstance;
import java.time.Duration;
import java.time.LocalDateTime;
public class DurationTest {
public static void main(String[] args) {
//本地日期时间对象
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
//出生日期时间对象
LocalDateTime birthDate = LocalDateTime.of(2001,03,8,02,14,39,39);
System.out.println(birthDate);
Duration duration = Duration.between(birthDate,today);
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的秒数
System.out.println(185705/24.0);
}
}
2022-05-14T20:04:58.918
2001-03-08T02:14:39.000000039
7737
185705
11142350
668541019917
668541019917999961
7737.708333333333
ChronoUnit
可用于在单个时间单位内测量一段时间,这个工具类最全的了,可以用于比较所有的时间单位
包装类
-
基本数据类型对应的引用类型
-
基本数据类型 引用数据类型 byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean
为什么提供包装类
- Java为了实现一切皆对象,为8种基本呢类型提供了对应的引用类型
- 后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型
自动装箱,自动拆箱
自动装箱: 基本类型的数据和变量可以直接赋值给包装类型的变量
自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量
包装类的特有功能
- 包装类的变量默认值可以是null,容错率更高
- 可以把基本类型的数据转成字符串类型(用处不大)
- 调用toString()方法得到基本字符串结果
- 调用Integer.toString(基本类型数据)
- 可以把字符串类型的数值转换成真实的数据类型(真的很有用)
- integer.parseint("字符串类型的整数")
- Double.parseDouble("字符串类型的小数")
- 一般不用
- 用.valueOf()方法