前言:
JDK8是java中具有里程碑意义的一个版本,在这个版本中增加Stream流,Lambda表达式和关于时间的LocalDate、LocalTime、LocalDateTime类。它们极大方便我们对java语言的运用,下面,我们就来介绍一下JDK8时间类的使用。
正文:
一、LocalDate类、LocalTime类、LocalDateTime类的使用:
LocalDate类、LocalTime类、LocalDateTime类这三个类大部分方法是一样的,以下文章大部分使用LocalDate类举例说明其用法。
1. 获取当前日期:
static LocalDate now() 从系统时钟获取现在时间
LocalDate localDate = LocalDate.now();
2. String转Date:
static LocalDate parse(CharSequence text) 字符串解析日期,默认格式yyyy-MM-dd
String DateStr1="2019-04-10";
LocalDate analyseDate1 = LocalDate.parse(DateStr1);
static LocalDate parse(CharSequence text , DateTimeFormatter formatter)
String DateStr2="20190410";
LocalDate analyseDate2 = LocalDate.parse(DateStr2, DateTimeFormatter.BASIC_ISO_DATE);
3. 设置日期:
LocalDate setDate = LocalDate.of(2020, 09, 04);
4. DateTime转String:
String format(DateTimeFormatter formatter)
LocalDate localDate = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
String formatDate = dtf.format(localDate);
5. 获取日期对象中的年,月,日:
int getYear() ,获取日期对象的年
int year = localDate.getYear();
Month getMonth(),获取日期对象的月的英文
Month mouth = localDate.getMonth();
int getMonthValue(), 获取日期对象的月
int month = localDate.getMonthValue();
int getDayOfMonth(), 获取日期对象在它的月中是第几天
int day = localDate.getDayOfMonth();
int getDayOfYear() , 获取日期对象在它那一年是第几天的月中是第几天
int day = localDate.getDayOfYear();
int getDayOfWeek(), 获取日期对象的星期
int day = localDate.getDayOfWeek();
String toString() 获取字符串类型的日期,例如:2020-09-04
String date = localDate.toString();
6. 判断方法:
boolean isLeapYear(),判断日期对象所在的年是否为闰年
boolean flag = localDate.isLeapYear();
boolean isBefore(LocalTime other) ,判断是否在给定时间对象之前
boolean flag = localDate.isBefore(analyseDate1);
boolean isAfter(LocalTime other),判断是否在给定时间对象之后
boolean flag = localDate.isAfter(analyseDate1);
boolean isEqual(ChronoLocalDate other),判断是否在给定时间对象是否相等
boolean flag =localDate.isEqual(analyseDate1);
7. 设置一段时间后的日期:
LocalDate plus(long amountToAdd, TemporalUnit unit) ,返回当前对象加上一定日期后的新的日期对象,第一个参数是多少,第二个参数是单位
当前日期对象两天后的日期: localDate.plus(2, ChronoUnit.DAYS)
当前日期对象两天前的日期: localDate.plus(-2, ChronoUnit.DAYS)
当前日期对象一周后的日期: localDate.plus(1, ChronoUnit.WEEKS)
当前日期对象一周前的日期: localDate.plus(-1, ChronoUnit.WEEKS)
LocalDate plusDays(long daysToAdd),返回当前对象加上一些天数后的新的日期对象
当前日期对象一天前的日期: localDate.plusDays(-1)
LocalDate plusWeeks(long weeksToAdd), 返回当前对象加上一些周数后的新的日期对象
当前日期对象一周前的日期: localDate.plusWeeks(-1)
LocalDate plusMonths(long monthsToAdd),返回当前对象加上一些月数后的新的日期对象
当前日期对象一月前的日期: localDate.plusMonths(-1)
LocalDate plusYears(long yearsToAdd),返回当前对象加上一些年数后的新的日期对象
当前日期对象一年前的日期: localDate.plusYears(-1)
8.修改日期返回新的日期:
LocalDate withMonth(int month) ,修改日期的月
修改日期的月,改成3月:localDate.withMonth(3)
LocalDate withYear(int year),修改日期的年
修改日期的年,改成2018年:localDate.withYear(2018)
LocalDate withDayOfMonth(int dayOfMonth),修改成当月的第几日
修改成当月的第2日:localDate.withDayOfMonth(2)
LocalDate withDayOfYear(int dayOfYear),修改成当年的第几日
修改成当年的第2日:localDate.withDayOfYear(2)
二、Duration类:
用来计算两个LocalTime对象或者两个两个LocalDateTime对象之间相差的时间,这里用LocalDateTime 来举例说明。
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 09, 04, 12, 32, 16);
LocalDateTime localDateTime2 = LocalDateTime.of(2020, 09, 02, 12, 32, 16);
static Duration between(Temporal startInclusive, Temporal endExclusive),根据两个LocalTime或者两个LocalDateTime创建Duration对象,参数,前小后大算出来正数,否则算出来负数
Duration duration = Duration.between(localDateTime1, localDateTime2);
将差值转换为天数返回: duration.toDays())
将差值转换为小时数返回: duration.toHours()
将差值转换为分钟数返回: duration.toMinutes()
Duration对象转换成的秒数: duration.getSeconds()
将差值转换为毫秒数返回: duration.toMillis()
三、Period类:
用来计算两个LocalDate相差的时间
LocalDate localDate1 = LocalDate.of(2019, 02, 17);
LocalDate localDate2 = LocalDate.of(2020, 04, 16);
static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive),根据给定的两个LocalDate对象创建Period对象,参数前小后大,算出来的为正,否则算出来负数
Period period = Period.between(localDate1, localDate2);
返回两个localDate年的相差数: period.getYears()
返回两个localDate月的相差数: period.getMonths()
返回两个localDate天的相差数: period.getDays()
四、ZoneId类:
获取本时区时间
ZonedDateTime zdt1 = ZonedDateTime.now();
修改时区为美国的印第安纳州
ZoneId zoneChanged = ZoneId.of("US/East-Indiana");
获取指定时区的时间,调用重载的now方法
ZonedDateTime zdt2 = ZonedDateTime.now(zoneChanged);
五、Instant类 :
时间线上的一个瞬时点,这可能用于记录应用程序的事件时间戳,Instant的精度可以达到纳秒级
1.获取本初子午线的标准时间:
Instant instant = Instant.now();
2.东八区的时间 偏移量:
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
3.距离1970年1月1日0:0:0(UTC)开始的毫秒数:
long nanos = instant.toEpochMilli();
4.根据偏移量获取时间:
Instant instantDate = Instant.ofEpochMilli(nanos);
六、Date与LocalDateTime相互转换:
1.Date <--> LocalDateTime:
ZoneId zone = ZoneId.systemDefault();
java.util.Date date = new java.util.Date();
Instant instant1 = date.toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant1, zone);
2. LocalDateTime <--> Date:
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTimeNow = LocalDateTime.now();
Instant instant2 = localDateTimeNow.atZone(zone).toInstant();
java.util.Date date = Date.from(instant2);
七、LocalDate、LocalTime、LocalDateTime之间转换:
1.LocalDateTime-->LocalDate :
LocalDate localDate = localDateTime3.toLocalDate();
2.LocalDateTime-->LocalTime:
LocalTime localTime = localDateTime3.toLocalTime();
3.LocalDate、LocalTime-->LocalDateTime:
LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.now());