参考:https://blog.csdn.net/xktxoo/article/details/91380332
1. 日期时间相关说明
1.1 名词
时区:同一时刻(时间戳),世界上各地区的时间可能是不一样的,具体时间与时区相关,按经度一共分为24个时区,英国格林尼治是0时区,中国北京是东8区 时间戳:时间戳(时刻)是指格林尼治时间1970年01月01日00时00分00秒距离当前时间的总毫秒数,如需根据时间戳获取本地时间,要加上时区(中国东8区加8小时)
1.2 时间输出格式
时间输出格式 说明 2021-09-20T14:44:25.861Z T是日期与时间的分隔符,Z是世界标准时间 2021-09-20T14:44:25.861 不含时区的时间 2021-09-20T14:44:25.861+08:00[Asia/Shanghai] 包含时区的时间 2021-09-21 只包含日期 09:55:28.591 只包含时间
1.3 常用日期相关类
类 说明 Instant 时间戳、世界标准时间、0时区 LocalDateTime/LocalDate/LocalTime 本地时区时间,时间不会带上时区 ZonedDateTime 包含时区的时间 DateTimeFormatter 时间格式化 Period 用于计算两个"日期"的间隔 Duration 用于计算两个"时间"的间隔
2. 构建日期时间相关对象
2.1 构造时间戳Instant
static Instant 方法 作用 now() 根据当前时间构建对象 ofEpochMilli(时间戳总毫秒数) 根据时间戳总毫秒数构建对象 parse(世界标准时间字符串) 根据世界标准时间字符串构建对象
Instant i1 = Instant . now ( ) ;
Instant i2 = Instant . ofEpochMilli ( System . currentTimeMillis ( ) ) ;
Instant i3 = Instant . parse ( "2021-09-20T22:57:48.838Z" ) ;
System . out. println ( i1) ;
System . out. println ( i2) ;
System . out. println ( i3) ;
2.2 构造本地时区日期时间LocalDateTime/LocalDate/LocalTime
static LocalDateTime方法 作用 now() 根据当前时间构建对象 of(年,月,日,时,分,秒,毫秒) 根据日期时间各部分构建对象 parse(日期字符串, 转换格式) 把日期字符串转换为日期对象
LocalDateTime dateTime = LocalDateTime . now ( ) ;
LocalDate date = LocalDate . now ( ) ;
LocalTime time = LocalTime . now ( ) ;
System . out. println ( dateTime) ;
System . out. println ( date) ;
System . out. println ( time) ;
LocalDateTime dt1 = LocalDateTime . of ( 2021 , 9 , 21 , 10 , 5 , 20 ) ;
LocalDateTime dt2= LocalDateTime . parse ( "2021-09-22 15:05:20" , DateTimeFormatter . ofPattern ( "yyyy-MM-dd HH:mm:ss" ) ) ;
2.3 构造时区日期时间ZonedDateTime
static ZonedDateTime方法 作用 now(时区) 根据当前时间构建对象 of(年,月,日,时,分,秒,毫秒,时区) 根据日期时间各部分构建对象 parse(包含时区的日期字符串) 把包含时区日期字符串转换为日期对象
ZonedDateTime z1 = ZonedDateTime . now ( ) ;
ZonedDateTime z2 = ZonedDateTime . now ( ZoneId . of ( "America/New_York" ) ) ;
ZonedDateTime z3 = ZonedDateTime . of ( 2021 , 9 , 21 , 15 , 15 , 15 , 300 , ZoneId . of ( "America/New_York" ) ) ;
ZonedDateTime z4 = ZonedDateTime . parse ( "2021-09-21T11:08:30.485+08:00[Asia/Shanghai]" ) ;
System . out. println ( z1) ;
System . out. println ( z2) ;
System . out. println ( z3) ;
System . out. println ( z4) ;
3. 日期时间对象相互转换
3.1 转换为LocalDateTime
Instant instant = Instant . now ( ) ;
LocalDateTime dt1 = LocalDateTime . ofInstant ( instant, ZoneId . systemDefault ( ) ) ;
System . out. println ( instant) ;
System . out. println ( dt1) ;
ZonedDateTime zonedDateTime = ZonedDateTime . now ( ZoneId . of ( "America/New_York" ) ) ;
LocalDateTime dt2 = zonedDateTime. toLocalDateTime ( ) ;
System . out. println ( zonedDateTime) ;
System . out. println ( dt2) ;
3.2 转换为Instant
LocalDateTime ldt = LocalDateTime . now ( ) ;
Instant instant = ldt. toInstant ( ZoneOffset . ofHours ( 8 ) ) ;
System . out. println ( ldt) ;
System . out. println ( instant) ;
ZonedDateTime zdt = ZonedDateTime . now ( ) ;
Instant instant2 = zdt. toInstant ( ) ;
System . out. println ( zdt) ;
System . out. println ( instant2) ;
3.3 转化为ZonedDateTime
Instant instant = Instant . now ( ) ;
ZonedDateTime zdt1 = ZonedDateTime . ofInstant ( instant, ZoneId . systemDefault ( ) ) ;
System . out. println ( instant) ;
System . out. println ( zdt1) ;
LocalDateTime ldt = LocalDateTime . now ( ) ;
ZonedDateTime zdt2 = ZonedDateTime . of ( ldt, ZoneId . systemDefault ( ) ) ;
System . out. println ( ldt) ;
System . out. println ( zdt2) ;
3.4 Date与Instant相互转换
Instant instant = Instant . now ( ) ;
Date date = Date . from ( instant) ;
Instant instant2 = date. toInstant ( ) ;
System . out. println ( instant) ;
System . out. println ( date) ;
System . out. println ( instant2) ;
4. 时间操作
4.1 时间读取
方法 说明 int getYear() 获取年份 int getMonthValue() 获取月份(数字) int getDayOfMonth() 获取日(一个月中的第几天) int getHour() 获取小时 int getMinute() 获取分 int getSecond() 获取秒 int getNano() 获取纳秒 Month getMonth() 获取月份,返回一个Month枚举,枚举值是英文月份 DayOfWeek getDayOfWeek() 获取星期,返回一个DayOfWeek,枚举值是英文星期 int getDayOfYear() 获取一年中的第几天
LocalDateTime ldt = LocalDateTime . now ( ) ;
System . out. println ( ldt) ;
System . out. println ( ldt. getYear ( ) ) ;
System . out. println ( ldt. getMonthValue ( ) ) ;
System . out. println ( ldt. getDayOfMonth ( ) ) ;
System . out. println ( ldt. getHour ( ) ) ;
System . out. println ( ldt. getMinute ( ) ) ;
System . out. println ( ldt. getSecond ( ) ) ;
System . out. println ( ldt. getNano ( ) ) ;
System . out. println ( ldt. getMonth ( ) ) ;
System . out. println ( ldt. getDayOfWeek ( ) ) ;
System . out. println ( ldt. getDayOfYear ( ) ) ;
4.2 时间修改
方法 说明 LocalDateTime withYear()/Month/DayOfMonth/Hour/Minute/Second 修改年月日时分秒 LocalDateTime plusYear()/Month/DayOfMonth/Hour/Minute/Second 增加年月日时分秒 LocalDateTime minusYear()/Month/DayOfMonth/Hour/Minute/Second 减少年月日时分秒 LocalDateTime plus/minus(TemporalAmount amountToSubtract) 添加或减少一个 Duration 或 Period LocalDateTime with(TemporalAdjuster adjuster) 根据时间调整器修改时间
TemporalAdjusters静态方法作为TemporalAdjuster参数
方法 说明 TemporalAdjusters.firstDayOfMonth() 本年本月第一天 TemporalAdjusters.lastDayOfMonth() 本年本月最后一天 TemporalAdjusters.firstDayOfNextMonth() 本年下一月第一天 TemporalAdjusters.firstDayOfNextYear() 下一年第一天 TemporalAdjusters.lastDayOfYear() 本年最后一天 TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY) 本月第一个周五 TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY) 本月最后一个周五 TemporalAdjusters.previous(DayOfWeek.FRIDAY) 前一个周五 TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY) 前一个周五,如果当前是周五则返回当前时间 TemporalAdjusters.next(DayOfWeek.FRIDAY) 下一个周五 TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY) 下一个周五,如果当前是周五则返回当前时间
LocalDateTime ldt = LocalDateTime . now ( ) ;
LocalDateTime ldt2 = ldt. withYear ( 2030 ) ;
LocalDateTime ldt3 = ldt. plusDays ( 63 ) ;
LocalDateTime ldt4 = ldt. with ( TemporalAdjusters . previous ( DayOfWeek . SUNDAY) ) ;
System . out. println ( ldt) ;
System . out. println ( ldt2) ;
System . out. println ( ldt3) ;
System . out. println ( ldt4) ;
4.3 计算日期时间间隔
Period与Duration实际上也是日期时间对象,可以使用LocalDateTime等类大部分方法
Period:计算两个日期之间的间隔
LocalDate ld1 = LocalDate . now ( ) ;
LocalDate ld2 = LocalDate . of ( 2020 , 2 , 2 ) ;
Period between = Period . between ( ld1, ld2) ;
System . out. println ( "相差的年:" + between. getYears ( ) ) ;
System . out. println ( "相差的月:" + between. getMonths ( ) ) ;
System . out. println ( "相差的天:" + between. getDays ( ) ) ;
System . out. println ( "相差的总月数:" + between. toTotalMonths ( ) ) ;
Duration :计算两个时间之间的间隔
LocalDateTime ldt1= LocalDateTime . now ( ) ;
LocalDateTime ldt2 = LocalDateTime . of ( 2020 , 2 , 2 , 2 , 2 , 2 ) ;
Duration between = Duration . between ( ldt1, ldt2) ;
System . out. println ( "相差的总天数:" + between. toDays ( ) ) ;
System . out. println ( "相差的总小时数:" + between. toHours ( ) ) ;
System . out. println ( "相差的总分钟数:" + between. toMinutes ( ) ) ;
System . out. println ( "相差的总秒数:" + between. getSeconds ( ) ) ;
System . out. println ( "相差的总毫秒数:" + between. toMillis ( ) ) ;
System . out. println ( "相差的总纳秒数:" + between. toNanos ( ) ) ;
4.4 日期时间格式化
LocalDateTime now = LocalDateTime . now ( ) ;
DateTimeFormatter f1 = DateTimeFormatter . ofPattern ( "yyyy年MM月dd日 HH时" ) ;
System . out. println ( f1. format ( now) ) ;
DateTimeFormatter f2 = DateTimeFormatter . ISO_DATE_TIME;
System . out. println ( f2. format ( now) ) ;
DateTimeFormatter f3 = DateTimeFormatter . ofLocalizedDateTime ( FormatStyle . SHORT) ;
System . out. println ( f3. format ( now) ) ;
4.5 日期比较判断
方法 说明 boolean isBefore() 当前日期时间是否在指定日期时间之前 boolean isAfter() 当前日期时间是否在指定日期时间之后 boolean isLeapYear() 判断LocalDate是否闰年,LocalDateTime没有这个方法
LocalDate ld1 = LocalDate . of ( 2020 , 1 , 1 ) ;
LocalDate ld2 = LocalDate . of ( 2021 , 1 , 1 ) ;
System . out. println ( "2020年是否在2021年之前:" + ld1. isBefore ( ld2) ) ;
System . out. println ( "2020年是否为闰年:" + ld1. isLeapYear ( ) ) ;