1.LocalDate LocalTime LocalDateTime
这三个类最突出的特点就是都是不可变的和线程安全的。
LocalDate是不可变的日期对象;LocalTime是一个不可变的时间对象;LocalDateTime是一个不可变的日期时间对象。也就是相当于LocalDateTime是LocalDate和LocalTime两者的一个综合体。三个类的操作都是相似的,这里就讲讲LocalDateTime这个类。
- LocalDateTime now() 从默认时区的系统时钟获取当前的日期时间。
LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
从年,月,日,小时,分钟和秒获得LocalDateTime的实例LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) 使用特定的格式化LocalDateTime从文本字符串获取LocalDateTime实例
LocalDateTime plus
Days(long days) 返回此LocalDateTime的副本,并以指定的时间段添加天数- LocalDateTime minusDays(long days) 返回此LocalDateTime的副本,并已指定的时间段减少天数
- LocalDateTime with(TemporalAdjuster adjuster) 返回此日期时间的调整副本
- OffsetDateTime atOffset(ZoneOffset offset) 将此日期时间与偏移量相结合以创建OffsetDateTime
举例:
//1.LocalDate LocalTime LocalDateTime
@Test
public void test() {
LocalDateTime ldt=LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt2=LocalDateTime.of(2015, 10, 19, 13, 22,33);
System.out.println(ldt2);
System.out.println(ldt2.plusDays(1));
System.out.println(ldt2.minusDays(1));
System.out.println(ldt2.getMonthValue());
System.out.println();
}
输出结果:
2018-09-15T14:39:17.294
2015-10-19T13:22:33
2015-10-20T13:22:33
2015-10-18T13:22:33
10
2.Instant 时间戳
- Instant now() 从系统时钟获取当前瞬间
- OffsetDateTime atOffset(ZoneOffset offset) 将此瞬间与偏移组合起来创建以恶搞OffsetDateTime
- Instant ofEpochSecond(long epochSecond) 使用从1970-01-01T00:00:00的时期开始的秒数获得Instant的实例
- Instant parse(CharSequence text) 从一个文本字符串(如,2007-12-03T10:15:30.00Z)获取一个Instant的实例
- long getEpochSecond() 从1970-01-01T00:00:00Z到现在的秒数
- long toEpochMilli() 将此瞬间转换为1970-01-01T00:00:00Z的时期的毫秒数
举例:
//2.Instant :时间戳(以Unix 元年:1970年1月1日00:00:00到某个时间之间的毫秒值)
@Test
public void test2() {
Instant ins1=Instant.now(); //默认获取UTC时区
System.out.println(ins1);
System.out.println(ins1.getEpochSecond());
OffsetDateTime t=ins1.atOffset(ZoneOffset.ofHours(8)); //偏移8小时
System.out.println(t);
System.out.println(ins1.toEpochMilli()); //获取毫秒值
Instant inst2=Instant.ofEpochSecond(60);
System.out.println(inst2);
}
输出结果:
2018-09-15T06:56:35.995Z
1536994595
2018-09-15T14:56:35.995+08:00
1536994595995
1970-01-01T00:01:00Z
3.Duration :计算两个时间之间的间隔
当我们需要计算两个时间之间的毫秒数时,往往可以借助Duration这个类来实现。
- Duration between(Temporal startInclusive,Temporal endExclusive) 获取一个Duration表示两个时间对象的持续时间
- long toMillis() 将此持续时间转换为总长度(以毫秒为单位)
举例:
@Test
public void test3() {
Instant ins1=Instant.now();
try {
Thread.sleep(1000);
}catch(InterruptedException e) {
}
Instant ins2=Instant.now();
Duration duration=Duration.between(ins1, ins2);
System.out.println(duration.toMillis());
LocalTime lt1=LocalTime.now();
try {
Thread.sleep(1000);
}catch(InterruptedException e) {
}
LocalTime lt2=LocalTime.now();
System.out.println(Duration.between(lt1, lt2).toMillis());
}
输出结果:
1000
1000
4.Period:计算两个日期之间的间隔
Period和Duration作用类似,但是Period主要是针对两个日期之间的间隔,它主要实现的是获取间隔有关的日期信息,比如年月日。
- Period between(LocalDate startDateInclusive ,LocalDate endDateExclusive) 获得一个Period,由两个日期之间的年数,月份和日期组成
- int getYears() 获得这段时间的年数
- int getMonths() 获去此期间的月数
- int getDays() 获得此期间的天数
Period的between方法和Duration的between是不同的,Period的between方法的参数类型必须是LocalDate类型。
举例:
@Test
public void test4() {
LocalDate ld1=LocalDate.of(2015, 1, 1);
LocalDate ld2=LocalDate.now();
Period period = Period.between(ld1, ld2);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
输出结果:
3
8
14
5.TemporalAdjuster:时间校正器
- TemporalAdjuster next(DayOfWeek dayOfWeek) 返回下一个星期的调整器,该调整器将日期调整为在调整日期之后的指定日期的的第一次出现
举例:
//TemporalAdjuster:时间校正器
@Test
public void test6() {
LocalDateTime ldt=LocalDateTime.of(2018, 9, 8,20,44,0);
System.out.println(ldt);
LocalDateTime ldt2=ldt.withDayOfMonth(10);
System.out.println(ldt2);
LocalDateTime ldt3=ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(ldt3);
//自定义:下一个工作日
LocalDateTime ldt5=ldt.with( (e) -> {
LocalDateTime l=(LocalDateTime)e;
DayOfWeek dow=l.getDayOfWeek();
if(dow.equals(DayOfWeek.FRIDAY)) {
return l.plusDays(3);
}else if(dow.equals(DayOfWeek.SATURDAY)) {
return l.plusDays(2);
}else {
return l.plusDays(1);
}
});
System.out.println(ldt5);
}
输出结果:
2018-09-08T20:44
2018-09-10T20:44
2018-09-09T20:44
2018-09-10T20:44
6.DateTimeFormatter:格式化时间/日期
- DateTimeFormatter ofPattern(String pattern) 使用指定的模式创建格式化程序
举例:
//DateTimeFormatter:格式化时间/日期
@Test
public void test7() {
DateTimeFormatter dtf=DateTimeFormatter.ISO_DATE;
LocalDateTime ldt=LocalDateTime.now();
String strDate=ldt.format(dtf);
System.out.println(strDate);
DateTimeFormatter dtf2=DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
System.out.println(dtf2.format(ldt));
String strDate2=dtf2.format(ldt);
LocalDateTime newDate=ldt.parse(strDate2,dtf2);
System.out.println(newDate);
}
输出结果:
2018-09-15
2018年09月15日 15:26:18
2018-09-15T15:26:18
7.常见使用
- 获取当前系统时间的时间戳
long ms = Instant.now().toEpochMilli();
- 获得当前系统时间的年月日
int year = LocalDateTime.now().getYear();
int month = LocalDateTime.now().getMonthValue();
int day = LocalDateTime.now().getDayOfMonth();