积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。
目录
在Java中常见的时间类为Date,格式化类型SimpleDateFormat。两者均不是线程安全的。这篇博文主要记录JDK8中的新时间日期类。
日期类LocalDate
时间输出
Date date = new Date();
System.out.println(date); //Mon Apr 18 13:31:08 CST 2022
LocalDate local = LocalDate.now();
System.out.println(local); //2022-04-18
格式化
Date常用SimpleDateFormat进行格式化;而LocalDate使用DateTimeFormatter进行格式化。
Date格式化
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(sdf.format(date)); //2022年04月18日
LocalDate格式化
LocalDate local = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
System.out.println(local.format(dtf)); //2022年04月18日
可以看见,格式化时两者的方式还是有区别的。
总结
Date包含了日期、时间、毫秒数众多的信息。LocalDate不包含时间,描述的是日期,如果对时间不关心,可以使用LocalDate。
DateTimeFormatter 不但是不变对象,它还是线程安全的。所以 DateTimeFormatter 可以只创建一个实例,到处引用。
LocalDate的常用用法
LocalDate转String
LocalDate localDate = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String Str = localDate.format(dtf);
System.out.println(Str); //2022年04月18日
String转LocalDate
String s = "2022年07月13日";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); //解析格式
LocalDate date = LocalDate.parse(s,dtf);
System.out.println(date); //2022-07-13
📢使用注意:
- 日期的位数必须和格式化时的位数对齐。比如2022年07月13日,则dtf必须为
yyyy年MM月dd日
;如果是2022年7月13日,则dtf必须为yyyy年M月dd日
。其他同理。
Date转LocalDate
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate); //2022-04-18
LocalDate转Date
LocalDate local = LocalDate.now();
Date from = Date.from(local.atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println(from); //Mon Apr 18 00:00:00 CST 2022
时间类LocalTime
获取时间
LocalTime localTime = LocalTime.now();
System.out.println(localTime); //14:14:14.981
时间格式化
LocalTime lt = LocalTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("mm分ss秒HH时");
System.out.println(lt.format(dateTimeFormatter)); //27分11秒14时
LocalTime的常用用法
String转LocalTime
String s = "10:51:01";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime parse = LocalTime.parse(s, dateTimeFormatter);
System.out.println(parse); //10:51:01
LocalTime转String
LocalTime lt = LocalTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH时mm分ss秒");
String s = lt.format(dateTimeFormatter);
System.out.println(s); //14时28分28秒
两个时间间隔
LocalTime start = LocalTime.parse("10:51:01.167526700");
LocalTime end = LocalTime.parse("10:51:33.167526701");
int time = end.toSecondOfDay() - start.toSecondOfDay();
System.out.println("两个时间相差:"+time+"秒"); //两个时间相差:32秒
时间比较
isAfter、isBefore只能比较之前之后,当值相等的时候,需要用compareTo比较。时间比较localTimeA.compareTo(localTimeB),若相等返回0;若A>B,返回1 ;若A<B返回-1。
LocalTime before = LocalTime.parse("10:51:01.167526700");
LocalTime after = LocalTime.parse("15:51:01.167526700");
//获取当前时分秒纳秒
System.out.println(before.isAfter(after)); //false
System.out.println(before.isBefore(after)); //true
System.out.println(before.compareTo(after)); //-1
System.out.println(after.compareTo(before)); //1
System.out.println(before.compareTo(before)); //0
获取时、分、秒、纳秒
LocalTime now = LocalTime.parse("15:51:01.167526700");
//获取小时
System.out.println(now.getHour()); //15
//获取分钟
System.out.println(now.getMinute()); //51
//获取秒
System.out.println(now.getSecond()); //1
//获取纳秒
System.out.println(now.getNano()); //167526700
修改时间
LocalTime time = LocalTime.parse("10:51:03.167526700");
//修改LocalTime变量的小时
System.out.println(time.withHour(1)); //01:51:03.167526700
//修改LocalTime变量的分钟
System.out.println(time.withMinute(1)); //10:01:03.167526700
//修改LocalTime变量的秒
System.out.println(time.withSecond(1)); //10:51:01.167526700
//修改LocalTime变量的纳秒
System.out.println(time.withNano(1)); //10:51:03.000000001
日期时间类LocalDateTime
组合了日期和时间,但不包含时差和时区信息。
获取当前
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); //2022-04-18T14:36:25.591
格式化
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println(localDateTime.format(dtf)); //2022年04月18日 14时39分28秒
LocalDateTime常用用法
String转LocalDateTime
String s = "2022-04-18 14:39:28";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parse = LocalDateTime.parse(s, dtf);
System.out.println(parse); //2022-04-18T14:39:28
LocalDateTime转String
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
String s = localDateTime.format(dtf);
System.out.println(s); //2022年04月18日 14时43分13秒
时间戳转LocalDateTime
long timestamp = System.currentTimeMillis();
Instant instant1 = Instant.ofEpochMilli(timestamp);
System.out.println(LocalDateTime.ofInstant(instant1, ZoneId.systemDefault())); //2022-04-18T14:12:36.897
日期时间类ZonedDateTime
最完整的日期时间,包含时区和相对UTC或格林威治的时差。
ZonedDateTime zdt = ZonedDateTime.now();
System.out.println(zdt); //2022-04-18T14:35:47.091+08:00[Asia/Shanghai]
总结
-
LocalDate:本地日期,不包含具体时间。 例如:2014-01-14等。
-
LocalTime:本地时间,不包含日期。例如:14:07:13:073。分别表示时、分、秒、毫秒。
-
LocalDateTime:组合了日期和时间,但不包含时差和时区信息。例如:2022-04-18T14:09:25.665
-
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。例如:2022-04-18T14:10:13.997+08:00[Asia/Shanghai]。