【JavaSE】java8日期时间操作

参考: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.861ZT是日期与时间的分隔符,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(世界标准时间字符串)根据世界标准时间字符串构建对象
// 1.获取当前时间戳
Instant i1 = Instant.now();
// 2.根据系统时间获取时间戳
Instant i2 = Instant.ofEpochMilli(System.currentTimeMillis());
// 3.把世界标准时间字符串串转换为时间戳,字符串必须包含T和Z
Instant i3 = Instant.parse("2021-09-20T22:57:48.838Z");

System.out.println(i1);  // 2021-09-20T15:23:50.813Z
System.out.println(i2);  // 2021-09-20T15:23:50.813Z
System.out.println(i3);  // 2021-09-20T22:57:48.838Z

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);  // 2021-09-21T09:55:28.590
System.out.println(date);      // 2021-09-21
System.out.println(time);      // 09:55:28.591
// 根据日期时间的年月日时分秒构建LocalDateTime对象
LocalDateTime dt1 = LocalDateTime.of(2021, 9, 21, 10, 5, 20);

// 把日期字符串转换为LocalDateTime对象
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);  // 2021-09-21T11:08:53.352+08:00[Asia/Shanghai]
System.out.println(z2);  // 2021-09-20T23:08:53.354-04:00[America/New_York]
System.out.println(z3);  // 2021-09-21T15:15:15.000000300-04:00[America/New_York]
System.out.println(z4);  // 2021-09-21T11:08:30.485+08:00[Asia/Shanghai]

3. 日期时间对象相互转换

3.1 转换为LocalDateTime

  • 其他时间对象转换为LocalDateTime
Instant instant = Instant.now();
// Instant转化为LocalDateTime,会自动对当地时区进行转换
LocalDateTime dt1 = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(instant);  // 2021-09-21T03:38:42.839Z
System.out.println(dt1);      // 2021-09-21T11:38:42.839

ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
// ZonedDateTime转换为LocalDateTime,只会把时区信息去掉
LocalDateTime dt2 = zonedDateTime.toLocalDateTime();
System.out.println(zonedDateTime);  // 2021-09-20T23:38:42.906-04:00[America/New_York]
System.out.println(dt2);            // 2021-09-20T23:38:42.906

3.2 转换为Instant

LocalDateTime ldt = LocalDateTime.now();
// 1.LocalDateTime转换为Instant,因为LocalDateTime没有包含时区信息,所以需要手动减去8时区
Instant instant = ldt.toInstant(ZoneOffset.ofHours(8));
System.out.println(ldt);       // 2021-09-24T18:06:37.307
System.out.println(instant);   // 2021-09-24T10:06:37.307Z

ZonedDateTime zdt = ZonedDateTime.now();
// 2.ZonedDateTime转换为Instant,因为ZonedDateTime已包含时区信息,会自动减去时区
Instant instant2 = zdt.toInstant();
System.out.println(zdt);         // 2021-09-24T18:10:46.244+08:00[Asia/Shanghai]
System.out.println(instant2);    // 2021-09-24T10:10:46.244Z

3.3 转化为ZonedDateTime

Instant instant = Instant.now();
// 1. Instant转换为ZonedDateTime,需要指定时区再加上该时区
ZonedDateTime zdt1 = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(instant);   // 2021-09-24T10:20:27.352Z
System.out.println(zdt1);      // 2021-09-24T18:20:27.352+08:00[Asia/Shanghai]

LocalDateTime ldt = LocalDateTime.now();
// 2. LocalDateTime转化为ZonedDateTime
ZonedDateTime zdt2 = ZonedDateTime.of(ldt, ZoneId.systemDefault());
System.out.println(ldt);      // 2021-09-24T18:20:27.423
System.out.println(zdt2);     // 2021-09-24T18:20:27.423+08:00[Asia/Shanghai]

3.4 Date与Instant相互转换

Instant instant = Instant.now();
// 1. Instant转化为Date,会自动加上当前地区时区
Date date = Date.from(instant);
// 2. Date转化为Instant,会自动减去当前地区时区
Instant instant2 = date.toInstant();
System.out.println(instant);   // 2021-09-24T10:35:56.294Z
System.out.println(date);      // Fri Sep 24 18:35:56 CST 2021
System.out.println(instant2);  // 2021-09-24T10:35:56.294Z

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);                    // 2021-09-24T18:51:48.596
/* 日期时间的组成部分 */
System.out.println(ldt.getYear());          // 2021
System.out.println(ldt.getMonthValue());    // 9
System.out.println(ldt.getDayOfMonth());    // 24
System.out.println(ldt.getHour());          // 18
System.out.println(ldt.getMinute());        // 51
System.out.println(ldt.getSecond());        // 48
System.out.println(ldt.getNano());          // 596000000

// getMonth()是英文月份,getMonthValue()是数字月份
System.out.println(ldt.getMonth());         // SEPTEMBER
// 获取星期几
System.out.println(ldt.getDayOfWeek());     // FRIDAY
// 一年内的第几填
System.out.println(ldt.getDayOfYear());     // 267

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);  // 把年份改为2030
LocalDateTime ldt3 = ldt.plusDays(63);    // 日期加上63天
LocalDateTime ldt4 = ldt.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY));  // 把日期改为上周日

System.out.println(ldt);    // 2021-09-24T19:30:46.053
System.out.println(ldt2);   // 2030-09-24T19:30:46.053
System.out.println(ldt3);   // 2021-11-26T19:30:46.053
System.out.println(ldt4);   // 2021-09-19T19:30:46.053

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());         //-1,相差1年
System.out.println("相差的月:"+between.getMonths());        //-7,还相差7月
System.out.println("相差的天:"+between.getDays());          //-22,还相差22天
System.out.println("相差的总月数:"+between.toTotalMonths());    //-19,总相差19个月

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());         // -600
System.out.println("相差的总小时数:"+between.toHours());      // -14418
System.out.println("相差的总分钟数:"+between.toMinutes());    // -865104
// 这里用getSeconds(),没有toSeconds()
System.out.println("相差的总秒数:"+between.getSeconds());     // -51906281
System.out.println("相差的总毫秒数:"+between.toMillis());     // -51906280789
System.out.println("相差的总纳秒数:"+between.toNanos());      // -51906280789000000

4.4 日期时间格式化

LocalDateTime now = LocalDateTime.now();
// 自定义格式化字符串
DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时");
System.out.println(f1.format(now));  // 2021年09月21日 11时

// 使用自带的格式化字符串
DateTimeFormatter f2 = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(f2.format(now));  // 2021-09-21T11:21:36.624

// 使用自带的风格
DateTimeFormatter f3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
System.out.println(f3.format(now));  // 21-9-21 上午11:21

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));     // true
System.out.println("2020年是否为闰年:"+ld1.isLeapYear());            // true
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值