JAVA笔记-Java8日期API

一、前言

    Java8之前我们操作日期时间会用到Date、Calendar,格式化日期用到SimpleDateFormat、DateFormat。但是这些操作对象是线程不安全的,而且想要计算日期是比较繁琐的。

    Java8给我们提供了新的时间日期api而且这些都是线程安全的,应且性能有所提升,实现代码比较简洁。

二、介绍

    ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则

    Instant: 用来表示时间线上的一个点(瞬时)

    LocalDate: 表示没有时区的日期(含年月日), LocalDate是不可变并且线程安全的

    LocalTime: 表示没有时区的时间(含时分秒), LocalTime是不可变并且线程安全的

    LocalDateTime: 表示没有时区的日期时间(年月日和时分秒), LocalDateTime是不可变并且线程安全的

    Clock: 用于访问当前时刻、日期、时间,用到时区

    Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔

    Period: 用于计算两个“日期”间隔

四、常用方法

// 获取当前时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
Clock clock = Clock.systemUTC(); // 根据系统时间和UTC返回当前时间
ZoneId zone = ZoneId.systemDefault();
ZoneId zoneId = ZoneId.of("UTC+8");
LocalDate.now(zoneId);

// 创建时间日期对象
LocalDate localDate = LocalDate.of(2020, 1, 1); // 2020-01-01
LocalTime localTime = LocalTime.of(1, 1, 1); // 01:01:01
LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 1, 1, 1); // 2020-01-01 01:01:01

// 日期时间的加减运算
LocalDateTime localDateTime = LocalDateTime.now(); // 当前日期
//以下方法的参数都是long型,返回值都是LocalDateTime
LocalDateTime plusYearsResult = localDateTime.plusYears(2L); // 当前日期加两年
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L); // 当前日期加3个月
LocalDateTime plusDaysResult = localDateTime.plusDays(7L); // 当前日期加7天
LocalDateTime plusHoursResult = localDateTime.plusHours(2L); // 当前日期加2小时
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L); // 当前日期加10分钟
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L); // 当前日期加10秒
// 或使用plus(long amountToAdd(偏移量), TemporalUnit unit(单位))方法
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
LocalDateTime nextWeek = localDateTime.plus(1, ChronoUnit.WEEKS);

// 直接修改当前日期到指定日期
LocalDate localDate = LocalDate.now(); // 当前日期
LocalDate withDayOfYearResult = localDate.withDayOfYear(200); // 本年当中的第几天,取值范围为1-365,366
LocalDate withDayOfMonthResult = localDate.withDayOfMonth(5); // 本月当中的第几天,取值范围为1-29,30,31
LocalDate withYearResult = localDate.withYear(2020); // 指定年份
LocalDate withMonthResult = localDate.withMonth(5); // 指定月份

// 获取日期的明细-年月日周时分秒
LocalDateTime localDateTime = LocalDateTime.now(); // 当前日期
int dayOfYear = localDateTime.getDayOfYear(); // 本年中的第几天
int dayOfMonth = localDateTime.getDayOfMonth(); // 本月当中第几天
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek(); // 本周当中第几天
int year = localDateTime.getYear(); // 当前年
Month month = localDateTime.getMonth(); // 当前月
int day = localDateTime.getDayOfMonth(); // 当前日
int hour = localDateTime.getHour(); // 当前小时
int minute = localDateTime.getMinute(); // 当前分钟
int second = localDateTime.getSecond(); // 当前秒

// 日期的比较
LocalDate localDate1 = LocalDate.of(2020, 1, 1);
LocalDate localDate2 = LocalDate.of(2020, 1, 2);
boolean date1IsBeforeDate2 = localDate1.isBefore(localDate2);

// 判断闰年
LocalDateTime localDateTime = LocalDateTime.now(); // 当前日期
localDateTime.isLeapYear();

// Instant和Date之间的转换
Instant instant = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();

// 计算日期间隔
LocalDate date1 = LocalDate.of(2020, 1, 1);
LocalDate date2 = LocalDate.of(2020, 1, 2);
Period period = Period.between(date1, date2);
long years = period.get(ChronoUnit.YEARS); // 或者period.getYears()
long months = period.get(ChronoUnit.MONTHS);// 或者period.getMonths()
long days = period.get(ChronoUnit.DAYS); // 或者period.getDays()
LocalDateTime date3 = LocalDateTime.now();
LocalDateTime date4 = LocalDateTime.of(2020, 1, 1, 1, 1, 1);
Duration duration = Duration.between(date3, date4);
long days2 = duration.toDays(); // 间隔天
long hours = duration.toHours(); // 间隔小时
long minutes = duration.toMinutes(); // 间隔分钟
long millis= duration.toMillis(); // 间毫秒
long nanos= duration.toNanos(); // 间隔纳秒

// 程序运行时间
Instant ins1 = Instant.now();
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1, ins2);
long millis2 = duration.toMillis();

// 格式化用法
DateTimeFormatter formatter1 = DateTimeFormatter.ISO_DATE_TIME;
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter formatter4 = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalDateTime date1 = LocalDateTime.now();
String date1Str = formatter1.format(date1);// date1.format(formatter1)
String aa = formatter3.format(LocalDate.now());
String bb = formatter4.format(LocalTime.now());

// 时间字符串转日期对象 格式需与字符串保持一致
String datetime =  "2020-01-01 01:01:01";  
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse(datetime, dtf);

// 将时间日期对象转为格式化后的时间日期对象
LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String temp = dtf1.format(ldt1);
LocalDateTime formatedDateTime = LocalDateTime.parse(temp, dtf1);

// 获取毫秒数
Instant ins = Instant.now();
Long milli = ins.toEpochMilli();

// 毫秒值转换为日期
DateTimeFormatter df= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String longToDateTime = df.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()),ZoneId.of("Asia/Shanghai")));

// 快速获取时间
LocalDateTime todayTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
LocalDateTime monthTime = LocalDateTime.of(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()), LocalTime.MIN);
LocalDateTime 30days = LocalDateTime.now().minus(30, ChronoUnit.DAYS);

// 日期转换
  // LocalDate->Date
Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  // Date->LocalDate
new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值