java8出的新的时间日期API

java8出的新的时间日期API都是线程安全的,并且性能更好,代码更简洁!

新时间日期API常用、重要对象介绍
ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
Instant: 用来表示时间线上的一个点(瞬时)
LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
Clock: 用于访问当前时刻、日期、时间,用到时区
Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
Period: 用于计算两个“日期”间隔

其中,LocalDate、LocalTime、LocalDateTime是新API里的基础对象,绝大多数操作都是围绕这几个对象来进行的,有必要搞清楚:
LocalDate : 只含年月日的日期对象
LocalTime :只含时分秒的时间对象
LocalDateTime : 同时含有年月日时分秒的日期对象

本文将以实例讲解日常开发中常用到的时间日期操作,如:
获取当前日期、时间:
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);

运行结果:
2018-03-18
16:58:20.799
2018-03-18T16:58:20.799

根据指定日期/时间创建对象:
LocalDate localDate = LocalDate.of(2018, 1, 13);
LocalTime localTime = LocalTime.of(9, 43, 20);
LocalDateTime localDateTime = LocalDateTime.of(2018, 1, 13, 9, 43, 20);
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);

运行结果:
2018-01-13
09:43:20
2018-01-13T09:43:20

日期时间的加减
对于LocalDate,只有精度大于或等于日的加减,如年、月、日;
对于LocalTime,只有精度小于或等于时的加减,如时、分、秒、纳秒;
对于LocalDateTime,则可以进行任意精度的时间相加减;

LocalDateTime localDateTime = LocalDateTime.now();
//以下方法的参数都是long型,返回值都是LocalDateTime
LocalDateTime plusYearsResult = localDateTime.plusYears(2L);
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L);
LocalDateTime plusDaysResult = localDateTime.plusDays(7L);
LocalDateTime plusHoursResult = localDateTime.plusHours(2L);
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L);
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L);

System.out.println("当前时间是 : " + localDateTime + “\n”
+ "当前时间加2年后为 : " + plusYearsResult + “\n”
+ "当前时间加3个月后为 : " + plusMonthsResult + “\n”
+ "当前时间加7日后为 : " + plusDaysResult + “\n”
+ "当前时间加2小时后为 : " + plusHoursResult + “\n”
+ "当前时间加10分钟后为 : " + plusMinutesResult + “\n”
+ "当前时间加10秒后为 : " + plusSecondsResult + “\n”
);

//也可以以另一种方式来相加减日期,即plus(long amountToAdd, TemporalUnit unit)
// 参数1 : 相加的数量, 参数2 : 相加的单位
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
LocalDateTime nextWeek = localDateTime.plus(1, ChronoUnit.WEEKS);

System.out.println("now : " + localDateTime + “\n”
+ "nextYear : " + nextYear + “\n”
+ "nextMonth : " + nextMonth + “\n”
+ “nextWeek :” + nextWeek + “\n”
);

//日期的减法用法一样,在此不再举例
运行结果:
当前时间:2018-03-28T17:04:18.623
当前时间加2年后为:2020-03-28T17:04:18.623

时间戳:
Date.from(Instant)就是用来把Instant转换成java.util.date的,
new Date().toInstant()就是将Date转换成Instant的
Instant instant=Instant.now();
//2019-09-08T16:50:19.174z
Date date=Date.from(instant);
System.out.println(date);
//Sun Step 09 00:19 CST 2019
Instant instant2=date.toInstant();
System.out.println(instant2);
//2019-09-08T16:50:19.174z

时间日期前后的比较与判断:
//判断两个时间点的前后
LocalDate localDate1=LocalDate.of(2018,6,8);
LocalDate localDate2=LocalDate.of(2019,6,8);
boolean date1IsBeforeDate2=localDate1.isBefore(localDate2);
System.out.println(“date1IsBeforeDate2:”+date1IsBeforeDate2);
运行结果:date1IsBeforeDate2==true

java8时钟:clock()
//返回当前时间,根据系统时间和UTC
Clock clock=Clock.systemUTC();
System.out.println(clock);
运行结果:SystemClock[z]

Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
//计算两个日期的日期间隔-年月日
LocalDate date1=LocalDate.of(2019,2,13);
LocalDate date2=LocalDate.of(2018,3,12);
//内部是date2-date1
Period period=Period.between(date1,date2);
System.out.println(“相差年数:”+period.getYears());
System.out.println(“相差月数:”+period.getMoths());
System.out.println(“相差日数:”+period.getDays());
//另一种方式获取相差的年月日
long years=period.get(ChronUnit.YEARS);
long months=period.get(ChronUnit.MONTHS);
long days=period.get(ChronUnit.Days);
//注意,当获取两个日期间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,
再折算成相应的几年几月几日

//计算两个时间的间隔
LocalDateTime date3=LocalDateTime.now();
LocalDateTime date4=LocalDateTime.of(2019,1,13,22,30,10);
Duration duration=Duration.between(date3,date4);
System.out.println(date3+“与”+date4+“间隔”+"\n"
+“天:”+duration.toDays()+"\n"
+“时:”+duration.toHours()+"\n"
+“分:”+duration.toMinutes()+"\n"
+“毫秒:”+duration.toMillis()+"\n"
+“纳秒:”+duration.toNanos+"\n"
);
运行结果:
相差年数:-1
相差月数:-11
相差日数:-1
相差的年月日分别为:0,-11,-1
2019-03-28T18:56:12.427与2019-01-13T22:30:10 间隔
天:-73
时:-1772
分:-106346
毫秒:-638076427
纳秒:-6380762427000000

当计算程序的运行时间时,应当使用时间戳instant
Instant ins1=Instant.now();
for(int i=0;i<10000000;i++){
}
Instant ins2=Instant.now();
Duration duration =Duration.between(ins1,ins2);
System.out.println(“程序运行耗时为:”+duration.toMillis()+“毫秒”);

时间日期的格式化(格式化后的类型是String)
1.使用jdk自身配置好的日期格式
DateTimeFormatter formatter1=DateTimeFormatter.ISO_DATE_TIME;
LocalDateTime date1=LocalDateTime.now();
String date1Str=formatter1.format(date1);
System.out.println(date1Str);
运行结果:
2018-03-28T18:59:36.6

2.使用自定义的格式
LocalDateTime date1=LocalDateTime.now();
DateTimeFormatter formatter2=DateTimeFormatter.ofPattern(“yyyy年MM月dd日 HH:mm:ss”);
String date2Str=formatter2.format(date1);
System.out.println(dataeStr);
运行结果:
2018年03月28日 18:59:36
//注:自定义转化的格式一定要与日期类型对应
LocalDate只能设置仅含年月日
LoaclTime只能设置仅含时分秒的格式
LocalDateTime可以设置年月日时分秒的格式

3.将时间字符串形式转化为日期对象
String datetime=“2018-01-13 21:27:30”;
DateTimeFormatter dtf=DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
LocalDateTime ldt=LocalDateTime.parse(datetime,dtf);
System.out.println(ldt);

4.将时间日期对象转化为格式化的时间日期对象
//新的格式化API中,格式化后的结果都默认是String,有时我们也需要返回经过格式化的同类型对象
LocalDateTime ldt1=LocalDateTime.now();
DateTimeFormatter dtf1=DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
String temp=dtf1.format(ldt1);
LocalDateTime formatDateTime=LocalDateTime.parse(temp,dtf1);
System.out.println(formatedDateTime);

5.long毫秒值转换为日期
System.out.println("-------------long毫秒值转换为日期------");
DateTimeFormatter df=DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
String longToDateTime=df.format(LocalDateTime.ofInstant(
Instant.ofEpochMilli(System.currentTimeMillis()),ZoneId.of(“Asia/Shanghai”)));
System.out.println(longDateTime);

日期时间的加减
对于LocalDate,只有精度大于或等于日的加减,如年、月、日;
对于LocalTime,只有精度小于或等于时的加减,如时、分、秒、纳秒;
对于LocalDateTime,则可以进行任意精度的时间相加减;

LocalDateTime localDateTime = LocalDateTime.now();
//以下方法的参数都是long型,返回值都是LocalDateTime
LocalDateTime plusYearsResult = localDateTime.plusYears(2L);
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L);
LocalDateTime plusDaysResult = localDateTime.plusDays(7L);
LocalDateTime plusHoursResult = localDateTime.plusHours(2L);
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L);
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L);

System.out.println("当前时间是 : " + localDateTime + “\n”
+ "当前时间加2年后为 : " + plusYearsResult + “\n”
+ "当前时间加3个月后为 : " + plusMonthsResult + “\n”
+ "当前时间加7日后为 : " + plusDaysResult + “\n”
+ "当前时间加2小时后为 : " + plusHoursResult + “\n”
+ "当前时间加10分钟后为 : " + plusMinutesResult + “\n”
+ "当前时间加10秒后为 : " + plusSecondsResult + “\n”
);

//也可以以另一种方式来相加减日期,即plus(long amountToAdd, TemporalUnit unit)
// 参数1 : 相加的数量, 参数2 : 相加的单位
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
LocalDateTime nextWeek = localDateTime.plus(1, ChronoUnit.WEEKS);

System.out.println("now : " + localDateTime + “\n”
+ "nextYear : " + nextYear + “\n”
+ "nextMonth : " + nextMonth + “\n”
+ “nextWeek :” + nextWeek + “\n”
);

//日期的减法用法一样,在此不再举例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值