5.4 日期时间类
日期时间类包括LocaIDate类、LocalTime类、Instant类、Duration类和period类等,这些类都包含在Java.time包中。
表5-9 表示日期时间的主要类
类的名称 | 功能描述 |
Instant | 表示时刻,代表的是时间戳 |
LocaIDate | 不包含具体时间的日期 |
LocalTime | 不包含日期的时间 |
LocalDateTime | 包含了日期和时间 |
Duration | 基于时间的值测量时间量 |
Period | 计算日期时间差异,只能精确到年月日 |
Clock | 时钟系统,用于查找当前时刻 |
5.4.1 Instant类
代表的是某个时间。
表5-10 Instant类的常用方法
方法声明 | 功能描述 |
now() | 从系统时钟获取当前时刻 |
now(Clock clock) | 从指定时钟获取当前时刻 |
ofEpochSecond(long epochSecond) | 从自标准Java计算时代开始的秒数获得一个Instant的实例 |
ofEpochMilli(long epochMilli) | 从自标准Java计算时代开始的毫秒数获得一个Instant的实例 |
getEpochSecond() | 从1970-01-01T00:00:00Z的标准Java计算时代获取秒数 |
getNano() | 从第二秒开始表示的时间线中返回纳秒数 |
parse(CharSequence text) | 从第一个文本字符串(如2007-12-03T10:15:30.00Z)获取一个Instant的实例 |
from(TemporalAccessor tenporal) | 从时间对象获取一个Instant的实例 |
案例演示5-20
import java.time.Instant;
public class Example20 {
public static void main(String[] args) {
// Instant 时间戳类从1970 -01 - 01 00:00:00 截止到当前时间的毫秒值
Instant now = Instant.now();
System.out.println("从系统获取的当前时刻为:"+now);
Instant instant = Instant.ofEpochMilli(1000 * 60 * 60 * 24);
System.out.println("计算机元年增加毫秒数后为:"+instant);
Instant instant1 = Instant.ofEpochSecond(60 * 60 * 24);
System.out.println("计算机元年增加秒数后为:"+instant1);
System.out.println("获取的秒值为:"+Instant.parse
("2007-12-03T10:15:30.44Z").getEpochSecond());
System.out.println("获取的纳秒值为:"+Instant.parse
("2007-12-03T10:15:30.44Z").getNano());
System.out.println("从时间对象获取的Instant实例为:"+
Instant.from(now));
}
}
5.4.2 LocalDate类
LocalDate类仅用来表示日期。在LocalDate类中提供了两个获取日期对象的方法,即now()和of(int year,int month,int dayOfMonth),具体代码如下:
//从一年、一个月和一天获得一个LocalDate的实例
LocalDate date = LocalDate.of(2020,12,12);
//从默认时区的系统时钟获取当前日期
LocalDate nowl = LocalDate.now();
表5-11 LocalDate的常用方法
案例演示5-21
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Example21 {
public static void main(String[] args) {
//获取日期时分秒
LocalDate now = LocalDate.now();
LocalDate of = LocalDate.of(2015, 12, 12);
System.out.println("1. LocalData的获取及格式化的相关方法--------");
System.out.println("从LocalData实例获取的年份为:"+now.getYear());
System.out.println("从LocalData实例获取的月份:"
+now.getMonthValue());
System.out.println("从LocalData实例获取当天在本月的第几天:"+
now.getDayOfMonth());
System.out.println("将获取到的Loacaldata实例格式化为:"+
now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
System.out.println("2. LocalData判断的相关方法----------------");
System.out.println("判断日期of是否在now之前:"+of.isBefore(now));
System.out.println("判断日期of是否在now之后:"+of.isAfter(now));
System.out.println("判断日期of和now是否相等:"+now.equals(of));
System.out.println("判断日期of是否时闰年:"+ of.isLeapYear());
//给出一个符合默认格式要求的日期字符串
System.out.println("3. LocalData解析以及加减操作的相关方法---------");
String dateStr="2020-02-01";
System.out.println("把日期字符串解析成日期对象后为"+
LocalDate.parse(dateStr));
System.out.println("将LocalData实例年份加1为:"+now.plusYears(1));
System.out.println("将LocalData实例天数减10为:"
+now.minusDays(10));
System.out.println("将LocalData实例指定年份为2014:"+
now.withYear(2014));
}
}
5.4.3 LocalTime类与LocalDate Time类
LelTime类用来表示时间,通常表示的是小时、分钟、秒。与LalalB样, 该类不能代表时间堡上的即时信息,只是时间的描述。在LoalTime类中提供了获取时间对象的方法,与oealDate 用法类似。
同时,LocalTime 类也提供了与日期类相对应的时间格式化、增减时分秒等常用方法,这些方法与日期类相对应。
案例学习5-22
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Example22 {
public static void main(String[] args) {
// 1. 获取当前时间,包含毫秒数
LocalTime time = LocalTime.now();
LocalTime of = LocalTime.of(9,23,23);
System.out.println("从LocalTime获取的小时为:"+time.getHour());
System.out.println("将获取到的LoacalTime实例格式化为:"+
time.format(DateTimeFormatter.ofPattern(" HH:mm:ss")));
System.out.println("判断时间of是否在now之前:"+of.isBefore(time));
System.out.println("将时间字符串解析为时间对象后为:"+
LocalTime.parse("12:15:30"));
System.out.println("从LocalTime获取当前时间,不包含毫秒数:"+
time.withNano(0));
}
}
案例5-22中调用了几个LoalTime的方法。
需要注意的是,当使用parse ( )方法解析字符电时符串要符合默认的时、分、秒格式要求。
LocalDateTime类是LocalDate类与LocalTime类的综合,它既包含日期,也包含时间,通过查看API可以知道,LocalDateTime 类中的方法包含了LocalDate 类与LocalTime类的方法。
LocalDateTimne默认的格式是2020-02-29T21:23:26.774,这可能与人们经常使用的格式不太符合,所以它经常与DateTmeFormatter起使用指定格式, 除了LocalDte与LocalTme类中的方法外,还额外提供了转换的方法。
下面通过一个案例来学习 LocalDateTlime 类中特有的方法,如下:
案例学习5-23
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Example23 {
public static void main(String[] args) {
//获取当前年月日,时分秒
LocalDateTime now = LocalDateTime.now();
System.out.println("获取的当前日期时间为:"+now);
System.out.println("将目标LocalDateTime转换为相应的LocalDate实例:"+
now.toLocalDate());
System.out.println("将目标LocalDateTime转换为相应的LocalTime实例:"+
now.toLocalTime());
//指定格式
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern
("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println("格式化后的日期时间为:"+now.format(ofPattern));
}
}
5.4.4Period和Duration类
1.Duration类
Duration类基于时间值,其作用范围是天、时、分、秒、毫秒和纳秒。
表5-12 Duration类的常用方法
方法声明 | 功能描述 |
between(Temporal starlnclusive,Temporal end Exclusive) | 获取一个Duration表示两个时间对象之间的持续时间 |
toDays() | 将时间转换为以天为单位 |
toHours() | 将时间转换为以小时为单位 |
toMinutes() | 将时间转换为以分组为单位 |
toMillis() | 将时间转换为以毫秒为单位 |
toNanos() | 将时间转换为以纳秒为单位 |
案例演示5-24
import java.time.Duration;
import java.time.LocalTime;
public class Example24{
public static void main(String[] args) {
LocalTime start = LocalTime.now();
LocalTime end = LocalTime.of(20,13,23);
Duration duration = Duration.between(start, end);
//间隔的时间
System.out.println("时间间隔为:"+duration.toNanos()+"纳秒");
System.out.println("时间间隔为:"+duration.toMillis()+"毫秒");
System.out.println("时间间隔为:"+duration.toHours()+"小时");
}
}
2.Period类
Period主要用于计算两个日期的间隔。
案例学习5-25
import java.time.LocalDate;
import java.time.Period;
public class Example25 {
public static void main(String[] args) {
LocalDate birthday = LocalDate.of(2018, 12, 12);
LocalDate now = LocalDate.now();
//计算两个日期的间隔
Period between = Period.between(birthday, now);
System.out.println("时间间隔为"+between.getYears()+"年");
System.out.println("时间间隔为"+between.getMonths()+"月");
System.out.println("时间间隔为"+between.getDays()+"天");
}
}