• Jdk8 时间和日期API介绍


    在项目开发中,需要对 Date 类型进行格式,否则可读性很差,格式化 Date 类型常用类却是 SimpleDateFormat,而在多线程环境下 SimpleDateFormat 可能会出现总是想不到的问题,因为 SimpleDateFormat 是线程不安全的,在多线程下建议使用 DateTimeFormatter 格式化日期

    Java8 日期和时间API中提供了3个时间类,分别是:LocalDate、LocalTime、LocalDateTime,绝大多数操作都是围绕这几个对象来进行的。

    LocalDateTime与Date区别:Date有的LocalDateTime都有,Date没有的LocalDateTime也有。

    下面列举的都是常用,想要了解更多请参考API文档。

    LocalDate

    LocalDate 是日期处理类,只含年月日的日期对象,LocalDate是不可变并且线程安全的。常用操作如下:

    1. // 获取当前日期
    2. LocalDate localDate = LocalDate.now();
    3. System.out.println(localDate);
    4. // 根据指定日期/时间创建对象
    5. localDate = LocalDate.of(2022, 8, 3);
    6. System.out.println(localDate);
    7. // 获取年
    8. System.out.println(localDate.getYear());
    9. System.out.println(localDate.get(ChronoField.YEAR));
    10. // 获取月
    11. System.out.println(localDate.getMonth());
    12. System.out.println(localDate.get(ChronoField.MONTH_OF_YEAR));
    13. // 获取日
    14. System.out.println(localDate.getDayOfMonth());
    15. System.out.println(localDate.get(ChronoField.DAY_OF_MONTH));
    16. // 获取星期
    17. System.out.println(localDate.getDayOfWeek());
    18. System.out.println(localDate.getDayOfWeek().getValue());
    19. System.out.println(localDate.get(ChronoField.DAY_OF_WEEK));
    20. // 在当前时间基础上指定本年中的第几天,取值范围1-366
    21. System.out.println(localDate.withDayOfYear(10));
    22. // 在当前时间基础上指定本月中的第几天,取值范围1-31
    23. System.out.println(localDate.withDayOfMonth(20));


    LocalTime

    LocalTime 是时间处理类,只含时分秒的时间对象,LocalTime是不可变并且线程安全的。常用操作如下:

    1. // 获取当前时间
    2. LocalTime localTime = LocalTime.now();
    3. System.out.println(localTime);
    4. // 设置时间
    5. localTime = LocalTime.of(13, 51, 10);
    6. System.out.println(localTime);
    7. //获取小时
    8. System.out.println(localTime.getHour());
    9. System.out.println(localTime.get(ChronoField.HOUR_OF_DAY));
    10. //获取分
    11. System.out.println(localTime.getMinute());
    12. System.out.println(localTime.get(ChronoField.MINUTE_OF_HOUR));
    13. //获取秒
    14. System.out.println(localTime.getSecond());
    15. System.out.println(localTime.get(ChronoField.SECOND_OF_MINUTE));


    LocalDateTime

    LocalDateTime 可以设置年月日时分秒,同时含有年月日时分秒的日期对象,相当于LocalDate + LocalTime;LocalDateTime是不可变并且线程安全的。常用操作如下:

    1. // 获取当前日期时间
    2. LocalDateTime localDateTime = LocalDateTime.now();
    3. System.out.println(localDateTime);
    4. // 获取LocalDate
    5. LocalDate localDate = localDateTime.toLocalDate();
    6. System.out.println(localDate);
    7. // 获取LocalTime
    8. LocalTime localTime = localDateTime.toLocalTime();
    9. System.out.println(localTime);
    10. // 设置日期
    11. localDateTime = LocalDateTime.of(2022, 8, 10, 14, 46, 56);
    12. System.out.println(localDateTime);
    13. localDateTime = LocalDateTime.of(localDate, localTime);
    14. System.out.println(localDateTime);
    15. // 日期时间的加减
    16. System.out.println(localDateTime.plusYears(2L));
    17. System.out.println(localDateTime.plus(2, ChronoUnit.MONTHS));
    18. // 获取日期的年月日周
    19. System.out.println(localDateTime.getDayOfYear());
    20. System.out.println(localDateTime.getDayOfMonth());
    21. System.out.println(localDateTime.getDayOfWeek().getValue());
    22. //增加一年
    23. System.out.println(localDateTime.plusYears(1));
    24. System.out.println(localDateTime.plus(1, ChronoUnit.YEARS));
    25. //减少一个月
    26. System.out.println(localDateTime.minusMonths(1));
    27. System.out.println(localDateTime.minus(1, ChronoUnit.MONTHS));
    28. // 修改年
    29. System.out.println(localDateTime.withYear(2021));
    30. System.out.println(localDateTime.with(ChronoField.YEAR, 2022));
    31. // 日期计算
    32. // 通过 TemporalAdjusters 类提供的方法获取年月周的开始和结束时间,
    33. LocalDate localDate1 = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
    34. System.out.println(localDate1);
    35. //  格式化时间
    36. localDate = LocalDate.of(2019, 9, 10);
    37. System.out.println(localDate.format(DateTimeFormatter.BASIC_ISO_DATE));
    38. System.out.println(localDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
    39. //自定义格式化
    40. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    41. System.out.println(localDate.format(dateTimeFormatter));
    42. // 解析时间
    43. System.out.println(LocalDate.parse("20220803", DateTimeFormatter.BASIC_ISO_DATE));
    44. System.out.println(LocalDate.parse("2021-08-03", DateTimeFormatter.ISO_LOCAL_DATE));


    Duration

    Duration 用于计算两个日期的“时间”间隔。常用操作如下:

    1. // 计算两个时间的间隔
    2. LocalDateTime localDateTime1 = LocalDateTime.now();
    3. LocalDateTime localDateTime2 = LocalDateTime.of(2022, 5, 13, 22, 30, 10);
    4. Duration duration = Duration.between(localDateTime1, localDateTime2);
    5. System.out.println(" 天 :" + duration.toDays());
    6. System.out.println(" 时 :" + duration.toHours());
    7. System.out.println(" 分 :" + duration.toMinutes());
    8. System.out.println(" 毫秒 :" + duration.toMillis());

    注意:并没有获得秒差的,可以通过分或毫秒转换得到。


    Period

    Period 用于计算两个“日期”间隔。常用操作如下:

    1. // 计算两个日期的间隔
    2. LocalDate localDate1 = LocalDate.of(2022, 5, 20);
    3. LocalDate localDate2 = LocalDate.of(2022, 8, 3);
    4. // 内部是用date2-date1,所以得到的结果是负数
    5. Period period = Period.between(localDate1, localDate2);
    6. System.out.println("相差年数 : " + period.getYears());
    7. System.out.println("相差月数 : " + period.getMonths());
    8. System.out.println("相差日数 : " + period.getDays());
    9. // 或
    10. System.out.println("相差年数 : " + period.get(ChronoUnit.YEARS));
    11. System.out.println("相差月数 : " + period.get(ChronoUnit.MONTHS));
    12. System.out.println("相差日数 : " + period.get(ChronoUnit.DAYS));

    注意:当获取两个日期的间隔时,并不是年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日。



    Date与LocalDateTime转换

    1. // datetime转字符串
    2. String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    3. System.out.println(format);
    4. // 字符串转datetime
    5. LocalDateTime localDateTime = LocalDateTime.parse(format, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    6. System.out.println(localDateTime);
    7. // LocalDateTime转date
    8. Date date1 = Date.from(localDateTime.toInstant(ZoneOffset.ofHours(8)));
    9. System.out.println(date1);
    10. Date date2 = Date.from(Instant.from(localDateTime.atZone(ZoneId.systemDefault())));
    11. System.out.println(date2);
    12. Date date3 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    13. System.out.println(date3);
    14. System.out.println();
    15. // date转LocalDateTime
    16. LocalDateTime localDateTime1 = date1.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
    17. System.out.println(localDateTime1);
    18. LocalDateTime localDateTime2 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    19. System.out.println(localDateTime2);
    20. // LocalDateTime转毫秒时间戳
    21. Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    22. long timestamp = instant.toEpochMilli();
    23. System.out.println(timestamp);
    24. // 时间戳转LocalDateTime
    25. System.out.println(LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()));

  • 相关阅读:
    Altium Designer利用IPC封装向导创建PCB封装
    计算机图形学:光线追踪(ray tracing)
    亚马逊Appstore不兼容Android 12,历时近两个月仍未解决
    4-7:用Redis优化登陆模块
    多线程概述
    ZooKeeper 概述
    [附源码]Python计算机毕业设计Django个人博客系统
    flutter 常用布局方式
    三层架构的学习和实例
    服务器数据恢复-UNIX类文件系统软件层级故障的数据恢复可能性分析
  • 原文地址:https://blog.csdn.net/xhaimail/article/details/126140395