jdk1.8中关于LocalDate的小练习

关于LocalDate的小练习

1.题目

完成以下日期时间处理的需求

  1. 找出下个月的倒数第3天是哪天
  2. 创建一个从2020.1.1 00:00:00 到 2020.12.31 23:59:59 之间的随机日期时间,要求随机的结果能覆盖整个时间段

2.代码

package com.ccjiuhong.assessment;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Random;

/**
 * 1. 找出下个月的倒数第3天是哪天
 * 2. 创建一个从2020.1.1 00:00:00 到 2020.12.31 23:59:59 之间的随机日期时间,要求随机的结果能覆盖整个时间段
 */
public class DateTimeHandler {
  public static void main(String[] args) {
    // 1.找出下个月的倒数第3天是哪天
    LocalDate today = LocalDate.now();
    LocalDate firstDayOfThisMonth = today.withDayOfMonth(1);
    LocalDate firstDayOfTheThirdMonth = firstDayOfThisMonth.plusMonths(2);
    LocalDate result = firstDayOfTheThirdMonth.minusDays(3);
    System.out.println("下个月的倒数第3天是:" + result);

    // LocalDate:本地日期 不包含具体时间 例如 2020-09-27。LocalDate.now(): 今日日期,2020-09-27。
    // today.withDayOfMonth(1):这个月的第一天,返回格式也是:2020-09-01
    // java.time.LocalDateTime.plusMonths(long monthsToAdd)方法:返回此日期时间的副本,并添加了指定的月份。
    // java.time.LocalDateTime.minusDays(longdaysToSubtract)方法返回此LocalDateTime的副本,并减去指定的天数。


    // 2.创建一个从2020.1.1 00:00:00 到 2020.12.31 23:59:59 之间的随机日期时间,要求随机的结果能覆盖整个时间段
    LocalDateTime start = LocalDateTime.of(2020, 1, 1, 0, 0, 0);
    LocalDateTime end = LocalDateTime.of(2020, 12, 31, 23, 59, 59);
    long startSecond = start.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    long endSecond = end.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    long randomSecond = startSecond + new Random().nextInt((int) (endSecond - startSecond + 1));
    Instant randomInstant = Instant.ofEpochSecond(randomSecond);
    LocalDateTime random = LocalDateTime.ofInstant(randomInstant, ZoneId.systemDefault());
    System.out.println("随机日期时间 = " + random);

    // LocalDateTime:结合了日期和时间 但不包含时差和时区 start = 2020-01-01T00:00
    // end = 2020-12-31T23:59:59
    // 获取从1970-01-01T00到2020.1.1的毫秒数 startSecond = 1577808000
    // ZoneId.systemDefault() 是 :Asia/Shanghai
    // 获取从1970-01-01T00到2020.12.31的毫秒数 endSecond = 1609430399
    // 在这两个毫秒数之间的随机毫秒数
    // 随机毫秒数转换成时间格式

    // 方法:public static Instant ofEpochSecond (long epochSecond)
    // 这个方法只接受一个参数epochSecond,它是从1970-01-01T00:00:00Z开始的秒数。
    // 返回为Instant类型的数据,例如:1970-01-14T21:20:00Z

    //  Java中LocalDateTime类的ofInstant(Instant Instant,ZoneId zone)方法:
    // 用于使用Instant和区域ID创建LocalDateTime的实例。将这两个参数传递给方法,并且在这两个参数的基础上方法返回LocalDateTime。

  }
}

posted @ 2022-02-15 14:34  Charles博客  阅读(58)  评论(0编辑  收藏  举报