java.time包使用指南初步了解

举报
叁拾伍 发表于 2021/05/17 19:05:24 2021/05/17
【摘要】 快速了解java.time包和内在内容,快速了解使用方法,帮助理解原理

写在前文:

java.time包内含丰富的类,不用觉得很麻烦也不用全部记下来,他们可以被分为四类:

1. date结尾的类,显示格式为yyyy-MM-dd。

2. time结尾的类,显示格式为HH-mm-ss-ns,其中1s=1000ns。

3. DateTime结尾的类,为1和2的结合,显示格式为yyyy-MM-ddTHH-mm-ss-ns,T可简单理解为分隔符。

4. TimeFormatter,这一类需要详细理解,可以初步理解为自定义时间显示格式(具体例子可看下方代码)。

需要注意的是,每一个“自定义格式”的Format只能改变同一个种类的对象,Local开头的LocalDate, LocalTime, LocalDateTime, LocalTimeFormatter;或者Offset开头的OffsetTime,OffsetDateTime。比如LocalTimeFormatter只能改变Local开头的三个对象。

结尾相同的类所用的方法大致类似,其中.of(自定义时间),.now(读取现在的时间),.getYear/Month/Day或者Hour/Minute/Second(返回你要的值)。

简单来说,java.time包的使用过程中可以一开始规定只用某一个种类的所属类(同一个开头搭配不同的结尾,如Local种类),可以有效帮助你理解和使用,方便查找api中的方法,也可以避免很多不同种类之间不能时间保存,时间格式,时间格式转换等问题。

1.java.time
Class:
LocalDate	LocalTime	LocalDateTime	LocalTimeFormatter
LocalDate ld = LocalDate.now();//yyyy-MM-dd
LocalTime lt = LocalTime.now();//HH-mm-ss-ns
LocalDateTime ldt = LocalDateTime.now();//yyyy-MM-dd-HHTmm-ss-ns
ld/lt/ldt.getYear/Month/Day/Hour/Minute/Second();
LocalDate ld = LocalDate.of(year,month,day);//自定义时间
LocalTime lt = LocalTime.of(hour, minute, second);
LocalDateTime ldt = LocalDateTime.of(year,month,day,hour,minute,second);
LocalDateTime ldt = LocalDateTime.of(LocalDate.now(),LocalTime.now());

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");//规定格式
String formattedDate = ld.format(dtf);/转化并保存
LocalDate ld = LocalDate.parse("2018/08/08", dtf);

ld.atTime(int hour, int minute, int seconds);//仅更改时分秒,会显示T以分割,可以放lt
ld/lt/ldt.withYear/Week/Month(int);//作用同上
ld.compareTo()/equals()/isLeapYear();
ld.minus/plusDay/Month(long daysToSubstract);

lt.compareTo();
lt.minus/plusHours/Minutes(long timeToSubstract);
LocalTime lt = LocalTime.MIDNIGHT/NOON/MAX/MIN(midnight和min一样,0时0分)

ZoneId zone1 = ZoneId.of("Asia/首都");/ZoneId.of("UTC+8");
ZoneId default = ZoneId.systemDefault();
LocalTime time1 = LocalTime.now(zone1);  

LocalDateTime ldt = ld.atTime(lt)/lt.atTime(ld);
LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();


2.java.time
Class:MonthDay OffsetTime OffsetDateTime Clock
MonthDay md = MonthDay.now();//存储当前月日
LocalDate ld = md.atYear(2020);
md.isValidYear(2020);//查看2020是否有今天

OffsetTime ot = OffsetTime.now();//不可更改的偏移时间
ot.getHour/Minute/Second();.toLocalTime();

OffsetDateTime odt = OffsetDateTime.now();
odt.getDayOfMonth/Week/Year();
odt.toLocalDate/Time();minusDay();

Clock c = Clock.systemDefaultZone(); c.getZone();//结果是类似的,查询所在时区
Clock c = Clock.systemUTC(); print(c.instant());//UTC的时间


3.java.time.Instant
Instant是不可改变的,改变等于新创建一个Instant对象,时间点的抽象
Instant i = Instant.now();

4.java.time.Duration & Period
时间段的抽象,
Duration主要是以整数值(秒和纳秒)来表示时间段,Period则是以周月年来表示时间段
LocalDateTime oneWeekAgoDateTime = ldt.plus(-2, ChronoUnit.WEEKS);
Duration duration = Duration.between(oneWeekAgoDateTime,LocalDateTime.now());
System.out.println(duration.getSeconds()); // 1209600
 
LocalDate oneWeekAgoDate = nowDate.plus(-1, ChronoUnit.WEEKS);
Period period = Period.between(oneWeekAgoDate, LocalDate.now());
System.out.println(period.getDays()); // 7
Duration 的 between 方法只能用于 Instant ,LocalTime 和 LocalDateTime 等对象的时间差计算。
而 Period 的 between 方法只能用于 LocalDate 的时间差计算。
而且不同的时间类型对象是不可以混用的,如试图计算 LocalDateTime 对象和 Instant 对象之间的时间差。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。