java8新特性之时间与日期类使用总结
1.为什么要使用java8新实现的时间与日期API在java8以前与时间有关的接口:(1) 当你在做有关时间日期的操作时,你会想到用Date;(2) 当你在做日期、月份、天数相加减时,你会想到用Calendar;(3) 当你需要对时间日期进行格式化时,你会想到使用SimpleDateFormat或DateFormat下的其他子类;但是这几个操作时间的类都是线程不安全的,它们都是可变的,在多线程的环
1.为什么要使用java8新实现的时间与日期API
在java8以前与时间有关的接口:
(1) 当你在做有关时间日期的操作时,你会想到用Date;
(2) 当你在做日期、月份、天数相加减时,你会想到用Calendar;
(3) 当你需要对时间日期进行格式化时,你会想到使用SimpleDateFormat或DateFormat下的其他子类;
但是这几个操作时间的类都是线程不安全的,它们都是可变的,在多线程的环境下使用这些类是会造成线程安全的问题的。所以在java8中实现的新的时间与日期API,这些新的API都是线程安全的。
2.java8中的时间日期API介绍
ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
Instant: 用来表示时间线上的一个点(瞬时)
LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
Clock: 用于访问当前时刻、日期、时间,用到时区
Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
Period: 对应使用 LocalDate ,它们的作用范围域是日期(年/月/日),用于计算两个日期的间隔
3.自己写的demo
1.获取当前日期
//获取当前日期
LocalDate now = LocalDate.now();
System.out.println(now);
2.对当前日期进行格式化
//对当前日期进行格式化
LocalDate now = LocalDate.now();
String yyyyMMdd = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(yyyyMMdd);
3.获取年月日
//获取年月日
LocalDate now = LocalDate.now();
int year = now.getYear();
int monthValue = now.getMonthValue();
int dayOfMonth = now.getDayOfMonth();
System.out.println(year + "-" + monthValue + "-" + dayOfMonth);
4.自定义时间进行格式化处理
//特殊时间的处理
String inDate = "20220202";
LocalDate of = LocalDate.of(Integer.parseInt(inDate.substring(0, 4)), Integer.parseInt(inDate.substring(4, 6)), Integer.parseInt(inDate.substring(6, 8)));
System.out.println(of.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
//使用预定义的格式化工具去解析或格式化日期
//DateTimeFormatter主要用于解析和格式话,更多的使用方式可以查看java8的api
/*BASIC_ISO_DATE
格式化或解析没有偏移量的日期的ISO日期格式化程序,例如“20111203”。*/
String dayAfterTommorrow = "20180210";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
/*ISO_LOCAL_DATE
ISO日期格式化程序格式化或解析没有偏移量的日期,如“2011-12-03”。*/
String dayAfterTommorrow2 = "2018-02-10";
LocalDate formatted2 = LocalDate.parse(dayAfterTommorrow2, DateTimeFormatter.ISO_LOCAL_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow2, formatted2);
5.判断两个日期是否相等
//判断两个日期是否相等
LocalDate of1 = LocalDate.of(2022, 3, 2);
LocalDate of2 = LocalDate.of(2022, 1, 2);
System.out.println(of1 + "---" + of1.equals(of2));
6.获取当前时间
//获取当前时间
LocalTime time = LocalTime.now();
System.out.println("local time now : " + time);
System.out.println("local time now : " + time.format(DateTimeFormatter.ofPattern("hhmmss")));
7.获取当前日期时间
//获取当前的日期时间
LocalDateTime now1 = LocalDateTime.now();
System.out.println(now1);
System.out.println(now1.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
8.在现有的时间上加上两个小时
//在现有的时间上增加小时
LocalTime timeAdd = LocalTime.now();
LocalTime newTime = timeAdd.plusHours(2); // 增加两小时
System.out.println("Time after 2 hours : " + newTime);
9.计算一个星期之后的日期
//计算一个星期之后的日期
/*第一种方式*/
LocalDate now2 = LocalDate.now();
LocalDate localDate = now2.plusDays(7);
System.out.println(localDate);
/*第二种方式*/
LocalDate localDate1 = now2.plusWeeks(1);
System.out.println(localDate1);
/*第三种方式*/
LocalDate plus = now2.plus(1, ChronoUnit.WEEKS);
System.out.println(plus);
//计算一个星期之前的日期
LocalDate now3 = LocalDate.now();
/*方式一*/
LocalDate localDate2 = now3.minusDays(7);
System.out.println(localDate2);
/*方式二*/
LocalDate localDate3 = now3.minusWeeks(1);
System.out.println(localDate3);
/*方式三*/
LocalDate minus = now3.minus(1, ChronoUnit.WEEKS);
System.out.println(minus);
10.计算一年之后的日期
//计算一年后的日期
/*方式一*/
LocalDate now4 = LocalDate.now();
LocalDate localDate4 = now4.plusYears(1);
System.out.println(localDate4);
/*方式二*/
LocalDate localDate5 = now4.plusMonths(12);
System.out.println(localDate5);
/*方式三*/
LocalDate plus1 = now4.plus(1, ChronoUnit.YEARS);
System.out.println(plus1);
/*方式四*/
LocalDate plus2 = now4.plus(12, ChronoUnit.MONTHS);
System.out.println(plus2);
11.计算一年之前的日期
//计算一年前的日期
LocalDate now5 = LocalDate.now();
/*方式一*/
LocalDate localDate6 = now5.minusYears(1);
System.out.println(localDate6);
/*方式二*/
LocalDate localDate7 = now5.minusMonths(12);
System.out.println(localDate7);
/*方式三*/
LocalDate minus1 = now5.minus(1, ChronoUnit.YEARS);
System.out.println(minus1);
/*方式四*/
LocalDate minus2 = now5.minus(12, ChronoUnit.MONTHS);
System.out.println(minus2);
12.判断日期是早于还是晚于另一个日期
LocalDate today = LocalDate.now();
LocalDate tomorrow = LocalDate.of(2022, 3, 6);
if(tomorrow.isAfter(today)){
System.out.println("Tomorrow comes after today");
}
//减去一天
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
if(yesterday.isBefore(today)){
System.out.println("Yesterday is day before today");
}
13.检查是否闰年
LocalDate today1 = LocalDate.now();
if(today1.isLeapYear()){
System.out.println("This year is Leap year");
}else {
System.out.println("2022 is not a Leap year");
}
14.计算两个日期的间距(相差的天数\年数\月数)
LocalDate now6 = LocalDate.now();
LocalDate localDate8 = LocalDate.of(2018, 11, 14);
Period periodToNextJavaRelease = Period.between(localDate8, now6);
/*Period时期类并不是直接返回两个日期相差的天数,而是返回相差了多少年多少个月多少天*/
System.out.println("日期"+localDate8+"距离"+now6+" 共: "
+ periodToNextJavaRelease.getYears() +"年" );
System.out.println("日期"+localDate8+"距离"+now6+" 共: "
+ periodToNextJavaRelease.getMonths() +"个月" );
System.out.println("日期"+localDate8+"距离"+now6+" 共: "
+ periodToNextJavaRelease.getDays() +"天" );
/*返回两个日期相差的天数*/
LocalDate from = LocalDate.of(2017, 9, 1);
long day = LocalDate.now().toEpochDay() - from.toEpochDay();
System.out.println("距离当前多少日:" + day);
15.获取时间戳
//获取时间戳
/*方式一,使用Timestamp与LocalDateTime*/
Timestamp timestamp= Timestamp.valueOf(LocalDateTime.now());
System.out.println(timestamp.getTime());
/*方式二,使用instant*/
Instant now7 = Instant.now();
long l = now7.toEpochMilli();
System.out.println(l);
16.MonthDay的使用
MonthDay可以处理一些周期事件,比如像生日、纪念日、法定假日(国庆以及春节)、或者每个月固定时间发送邮件给客户 这些周期性事件
MonthDay now8 = MonthDay.now();
LocalDate dateOfBirth = LocalDate.of(2018, 01, 21);
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
if(now8.equals(birthday)){
System.out.println("Many Many happy returns of the day !!");
}else{
System.out.println("Sorry, today is not your birthday");
}
17.YearMonth的使用
YearMonth是一个不变的日期时间对象,表示一年和一个月的组合。 可以获得可以从年和月派生的任何字段,例如四分之一年份。
YearMonth currentYearMonth = YearMonth.now();
System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
/*Month是月份的枚举类1-12月,FEBRUARY为月份*/
YearMonth creditCardExpiry = YearMonth.of(2028, Month.FEBRUARY);
System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
int i = currentYearMonth.lengthOfMonth();
System.out.println("当前月份有多少天" + i);
目前就先写这些案例,场景不是很全,后续有用到新的API在做补充。
更多推荐
所有评论(0)