1、传统时间格式化的线程安全问题
SimpleDateFormat 是线程不安全的
2、LocalDate , LocalTime, LocalDateTime
public void test(){
//获取当前时间
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
//获取某个具体的时间
LocalDateTime ldt2 = LocalDateTime.of(2021, 2, 3, 22, 10);
System.out.println(ldt2);
//年的加减
LocalDateTime ldt3 = ldt.plusYears(1);
System.out.println(ldt3);
//获取某个时间的年、月、日
System.out.println(ldt.getYear());
System.out.println(ldt.getMonth());
}
3、Instant: 时间戳(以Unix:1970年1月1日00:00:00 到某个时间之间的毫秒值)
@Test
public void test2(){
//默认获取 UTC 时区(美国那边的时区)
Instant ins1 = Instant.now();
System.out.println(ins1);
//标准时区偏移8小时
OffsetDateTime offsetDateTime = ins1.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
//时间转化为毫秒
System.out.println(ins1.toEpochMilli());
}
4、Duration: 计算两个时间之间的间隔 Period: 计算两个日期之间的间隔
@Test
public void test3() throws InterruptedException {
Instant ins1 = Instant.now();
Thread.sleep(1000);
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1, ins2);
System.out.println("两个时间相差:"+duration.getSeconds()+"s");
LocalDate ld1 = LocalDate.of(2021, 2, 10);
LocalDate now = LocalDate.now();
Period between = Period.between(ld1, now);
System.out.println(between);
System.out.println(between.getDays());
}
5、时间矫正器
TemporalAdjuster:时间矫正器。有时候我们需要获取例如:将日期调整到 ”下个周日“等操作
TemporalAdjusters:该类通过静态方法提供了大量的常用 TemporalAdjuster的实现
例如获取下个周日:
LocalDate nextSunday = LocalDate.now() .with(TemporalAdjusters.next(DayOfWeek.SUNDAY))
public void test1(){
LocalDateTime ldt = LocalDateTime.now();
System.out.println("当前时间为:"+ldt);
//求下一个周日
LocalDateTime nextSunday = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println("下一个周日为:"+nextSunday);
//自定义: 下一个工作日
// 传进来的参数 l ,其实就是 ldt
LocalDateTime nextweekday = ldt.with((l) -> {
LocalDateTime local = (LocalDateTime)l;
DayOfWeek dayOfWeek = local.getDayOfWeek();
if(dayOfWeek.equals(DayOfWeek.FRIDAY)){
return local.plusDays(3);
}else if(dayOfWeek.equals(DayOfWeek.SATURDAY)){
return local.plusDays(2);
}else{
return local.plusDays(1);
}
});
System.out.println(nextweekday);
}
6、时间格式化与时区的处理
1) 时间格式化
public void test(){
// 时间转化为固定格式的字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.now();
String result = ldt.format(formatter);
System.out.println(result);
//固定格式的字符串转化为时间
//这里不知道哪儿出错了...
LocalDateTime parse = ldt.parse(result,formatter);
System.out.println(parse);
}
2)时区处理
//ZoneDate ZoneTime ZoneDateTime
@Test
public void test1(){
//1、查看所有支持时区
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
System.out.println(availableZoneIds);
//2、创建时间时,指定时区
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Aden"));
//或者
LocalDateTime ldt2 = LocalDateTime.now();
ZonedDateTime zonedDateTime = ldt2.atZone(ZoneId.of("Asia/Aden"));
}