当前位置: 首页 > 后端技术 > Java

【语言】如何使用JavaDateAPI

时间:2023-04-01 17:45:01 Java

前言在日常开发中,我们经常会用到一些与日期相关的数据操作,比如:获取日期对应的星期几,获取月份是否存在等操作来获取时间。Java8之前的日期API设计非常反人类。使用newDate()创建时间时,获取年份时,从1900年开始计算,获取到的0月代表1月。并且在使用的时候不能保证线程安全,多线程操作时可能会出现问题。在Java8中,时间API被重新设计并明确分离。它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unixtimestamp)和时区定义了不同的类,并且所有的类都是不可变的,保证了使用中的线程安全。本文将对开发中的常用案例进行讲解,方便高效开发。核心类Java8日期时间默认格式如下:yyyy-MM-dd-HH-mm-ss.zzz几个主要的核心类:LocalDate:表示日期类,不包括时间、小时、分钟和秒LocalTime:表示时间类,不包括DateMonthDayYearLocalDateTime:表示日期时间类ZonedDateTime:表示时区日期时间类OffsetDateTime:表示根据UTC时间偏移获取日期时间Clock:表示获取当前瞬时时间,某个时区的日期或时间Instant:表示UnixTime,代表一个时间戳,比如2018-01-14T02:20:13.592ZDuration:两个时间之间,代表一个绝对精确的跨度,以毫秒为单位Period:代表之间两个日期ZoneId:代表时区DateTimeFormatter:代表格式化输出TemporalAdjusters:代表获取指定的日期时间,比如当月的第一天,今年的最后一天等。常见情况获取今天的日期使用LocalDate对象的now()直接获取今天的日期。然后可以通过DateTimeFormatter格式化并打印日期。LocalDatelocalDate=LocalDate.now();System.out.println("今天的日期是:"+localDate);DateTimeFormatterfmtDate=DateTimeFormatter.ofPattern("yyyyMMdd");System.out.println("今天的日期格式:"+localDate.format(fmtDate));/***--------打印--------*今天的日期是:2021-11-12*今天的日期格式:20211112*/GetDatelocalDatelocalDate=LocalDate.now();intyear=localDate.getYear();intmonth=localDate.getMonthValue();intday=localDate.getDayOfMonth();System.out.println("年:"+年);System.out.println("月:"+月);System.out.println("日:"+日);/***-------print--------*Year:2021*Month:11*Day:12*/比较不同的日期LocalDate对象可以通过equals()/isAfter()/isBefore()方法比较日期,非常方便.LocalDatelocalDate=LocalDate.now();LocalDatelocalDateOther=LocalDate.of(2021,11,11);System.out.println("localDate等于localDateOther:"+localDate.equals(localDateOther));System.out.println("localDate大于localDateOther:"+localDate.isAfter(localDateOther));System.out.println("localDate小于localDateOther:"+localDate.isBefore(localDateOther));/***--------print---------*localDateisequaltolocalDateOther:false*localDateisgreaterthanlocalDateOther:true*localDateislessthanlocalDateOther:false*/获取当前时间使用的now()LocalTime对象直接获取今天的时间,不包括日期。LocalTimenowTime=LocalTime.now();System.out.println("当前时间是:"+nowTime);/***------print------*当前时间is:12:56:17.908*/日期时间的计算使用了LocalTime对象的now(),直接获取今天的时间,不需要日期。LocalDatelocalDate=LocalDate.of(2021,11,11);LocalTimenowTime=LocalTime.now();LocalDatetempDate;LocalTimetempTime;tempDate=localDate.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).minusDays(7);System.out.println("今年双十一上周是星期一:"+tempDate);DayOfWeekdayOfWeek=localDate.getDayOfWeek();System.out.println("今年双11是几号?:"+dayOfWeek);tempTime=nowTime.plusHours(5).plusMinutes(20);System.out.println("5小时20分钟后:"+tempTime);tempTime=nowTime.minusHours(3);System.out.println("3小时前者为:"+tempTime);/***------print------*今年双11最后一个周一为:2021-11-01*今年双11是几号?:THURSDAY*5小时20分钟后是:18:28:44.508*3小时前是:10:08:44.508*/计算两个日期之间的间隔使用LocalTime对象的now()直接获取今天的时间,没有约会。LocalDatelocalDate=LocalDate.of(2019,5,1);LocalDatelocalDateOther=LocalDate.of(2021,11,11);Periodperiod=Period.between(localDate,localDateOther);System.out.println("Years:"+period.getYears()+"months:"+period.getMonths()+"days:"+period.getDays());/***--------打印---------*年:2月:6天:10*/总结通过使用LocalDate和LocalTime,可以高效计算常见业务场景的时间和日期,多练习自己做。