Java8 操作时间API实践与说明

Java8 时间操作

java8的操作时间与以往的不同,以往用的比较多的是,时间戳通过System去获取,获取日期时间通过Date、Calendar类来操作,获取日期时间格式输出则通过SimpleDateFormat来转化,Java8后,以上的仍然可以使用,不过新出了操作时间的API。(经查阅资料,SimpleDateFormat是线程不安全的,这跟使用方式有关,有兴趣可以了解下)。

Java8 的各个日期时间类型

  • LocalDate:不包含时间的日期,例如:2020-08-24,单纯的表示日期
  • LocalTime:与LocalDate的用法类似,但表示的时间,没有日期,例如:12:06:51.146,单纯的时间概念
  • LocalDateTime:这个从命名来看,其实就已经很显然了,就是日期+时间(没有偏移量,时区),例如:22020-08-24T12:06:51.146
  • ZonedDateTime:包含时区的完整日期时间,偏移量是以UTC/格林威治时间为基准,例如:2020-08-24T10:12:37.646+08:00[GMT+08:00]
  • Instant:时间戳,与System.currentTimeMillis()类似,Instant.now().toEpochMilli();
  • Duration:表示一个时间段
  • Period:用来表示以年月日来衡量一个时间段
  • DateTimeFormatter:日期解析格式化类
  • Clock:时钟

LocalDate

通过代码实现,玩转一下LocalDate:

public static void localDateDemo() {
    
    
    //获取当前时间
    LocalDate localDate = LocalDate.now();
    System.out.println("当前年月日:" + localDate);

    //获取年
    int yearOneWay = localDate.getYear();
    int yearAnotherWay = localDate.get(ChronoField.YEAR);
    System.out.println("yearOneWay:" + yearOneWay + ",yearAnotherWay:" + yearAnotherWay);

    //获取年的天数
    int yearDays = localDate.lengthOfYear();
    System.out.println("今年多长:" + yearDays);

    //获取月
    int month = localDate.getMonth().getValue();
    int month1 = localDate.getMonthValue();
    int month2 = localDate.get(ChronoField.MONTH_OF_YEAR);
    System.out.println("今年月份 month:" + month);
    System.out.println("今年月份 month1:" + month1);
    System.out.println("今年月份 month2:" + month2);

    //虎丘月的天数
    int monthDays1 = localDate.lengthOfMonth();
    System.out.println("本月多长 monthDays1:" + monthDays1);

    //获取天
    int daysOfYear = localDate.getDayOfYear();
    int daysOfYears1 = localDate.get(ChronoField.DAY_OF_YEAR);
    System.out.println("今天是今年的第几天:daysOfYear:" + daysOfYear  + ", daysOfYear1:" + daysOfYears1);
    int daysOfMonth = localDate.getDayOfMonth();
    int daysOfMonth1 = localDate.get(ChronoField.DAY_OF_MONTH);
    System.out.println("今天是这个月的第几天:daysOfMonth:" + daysOfMonth + ",dayOfMonth1:" + daysOfMonth1);


    //获取星期
    int dayOfWeek = localDate.getDayOfWeek().getValue();
    int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
    int dayOfWeek2 = localDate.getDayOfWeek().get(ChronoField.DAY_OF_WEEK);
    System.out.println("这是星期的第几天:dayOfWeek:" + dayOfWeek + ",dayOfWeek1:" + dayOfWeek1 + ",dayOfWeek2:" + dayOfWeek2);
  }

运行结果如下:

当前年月日:2020-08-24
yearOneWay:2020,yearAnotherWay:2020
今年多长:366
今年月份 month:8
今年月份 month1:8
今年月份 month2:8
本月多长 monthDays1:31
今天是今年的第几天:daysOfYear:237, daysOfYear1:237
今天是这个月的第几天:daysOfMonth:24,dayOfMonth1:24
这是星期的第几天:dayOfWeek:1,dayOfWeek1:1,dayOfWeek2:1

LocalTime

示例代码

public static void localTimeDemo() {
    
    
    LocalTime localTime = LocalTime.now();
    //当前时间
    System.out.println("当前时间:localTime:" + localTime);

    //获取时
    int hours = localTime.getHour();
    System.out.println("当前小时:hours:" + hours + " ,HOUR_OF_DAY:" + localTime.get(ChronoField.HOUR_OF_DAY)
    + ",HOUR_OF_AMPM:" + localTime.get(ChronoField.HOUR_OF_AMPM)
    + ",CLOCK_HOUR_OF_DAY: " + localTime.get(ChronoField.CLOCK_HOUR_OF_DAY)
        + ",CLOCK_HOUR_OF_AMPM: " + localTime.get(ChronoField.CLOCK_HOUR_OF_AMPM));

    //当前分
    int m = localTime.getMinute();
    System.out.println("当前分:minutes:" + m + " ,MINUTE_OF_DAY:" + localTime.get(ChronoField.MINUTE_OF_DAY)
        + ",MINUTE_OF_HOUR:" + localTime.get(ChronoField.MINUTE_OF_HOUR));

    //获取秒
    int second = localTime.getSecond();
    System.out.println("当前秒:second:" + second + " ,SECOND_OF_DAY:" + localTime.get(ChronoField.SECOND_OF_DAY)
        + ",SECOND_OF_MINUTE:" + localTime.get(ChronoField.SECOND_OF_MINUTE));
    
  }

运行结果:

当前时间:localTime:11:04:03.570
当前小时:hours:11 ,HOUR_OF_DAY:11,HOUR_OF_AMPM:11,CLOCK_HOUR_OF_DAY: 11,CLOCK_HOUR_OF_AMPM: 11
当前分:minutes:4 ,MINUTE_OF_DAY:664,MINUTE_OF_HOUR:4
当前秒:second:3 ,SECOND_OF_DAY:39843,SECOND_OF_MINUTE:3

LocalDateTime

代码示例:

public static void localDateTimeDemo() {
    
    
    // 当前日期和时间
    LocalDateTime today = LocalDateTime.now();
    System.out.println("现在是:" + today);

    // 创建指定日期和时间
    LocalDateTime anotherDay = LocalDateTime.of(2020, Month.AUGUST, 8, 8, 8, 8);
    System.out.println("创建的指定时间是:" + anotherDay);

    // 拼接日期和时间
    // 使用当前日期,指定时间生成的 LocalDateTime
    LocalDateTime thisTime = LocalTime.now().atDate(LocalDate.of(2020, 8, 8));
    System.out.println("拼接的日期是:" + thisTime);
    // 使用当前日期,指定时间生成的 LocalDateTime
    LocalDateTime thisDay = LocalDate.now().atTime(LocalTime.of(12, 24, 12));
    System.out.println("拼接的日期是:" + thisDay);
    // 指定日期和时间生成 LocalDateTime
    LocalDateTime thisDayAndTime = LocalDateTime.of(LocalDate.of(2020, 8, 8), LocalTime.of(12, 24, 12));
    System.out.println("拼接的日期是:" + thisDayAndTime);

    // 获取LocalDate
    LocalDate todayDate = today.toLocalDate();
    System.out.println("今天日期是:" + todayDate);

    // 获取LocalTime
    LocalTime todayTime = today.toLocalTime();
    System.out.println("现在时间是:" + todayTime);
  }

运行结果:

现在是:2020-08-24T11:08:55.462
创建的指定时间是:2020-08-08T08:08:08
拼接的日期是:2020-08-08T11:08:55.463
拼接的日期是:2020-08-24T12:24:12
拼接的日期是:2020-08-08T12:24:12
今天日期是:2020-08-24
现在时间是:11:08:55.462

Instant

代码示例:

public static void instantDemo() {
    
    
    //当前时间
    Instant instant = Instant.now();

    //获取到秒数
    System.out.println("当前秒数:" + instant.getEpochSecond());

    //获取到毫秒
    System.out.println("当前纳秒数:" + instant.toEpochMilli());
  }

运行结果:

当前秒数:1598238919
当前纳秒数:1598238919914

Duration

代码示例:

public static void  durationDemo() {
    
    
    LocalDateTime from = LocalDateTime.now();
    LocalDateTime to = LocalDateTime.now().plusDays(1);
    // 通过between()方法创建
    Duration duration = Duration.between(from, to);
    System.out.println("时间段,duration天数:" + duration.toDays() + ",小时:" + duration.toHours() + ", 分:" + duration.getSeconds());
    // 通过of()方法创建,该方法参数为时间段长度和时间单位。
    // 7天
    Duration duration1 = Duration.of(7, ChronoUnit.DAYS);

    System.out.println("时间段,duration1天数:" + duration1.toDays() + ",小时:" + duration1.toHours() + ", 分:" + duration1.getSeconds());
    // 60秒
    Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);
    System.out.println("时间段,duration2:" + duration2.toDays() + ",小时:" + duration2.toHours() + ", 分:" + duration2.getSeconds());
  }

运行结果:

时间段,duration天数:1,小时:24, 分:86400
时间段,duration1天数:7,小时:168, 分:604800
时间段,duration2:0,小时:0, 分:60

Period

代码示例:

private static void periodDemo() {
    
    
    // 通过of方法
    Period period = Period.of(2012, 12, 24);

    System.out.println("年相差,月相差,日相差,年:" + period.getYears() + "  月:" + period.getMonths() + "   日:" + period.getDays()) ;
    // 通过between方法
    Period period1 = Period.between(LocalDate.now(), LocalDate.of(2021,12,31));

    System.out.println("年相差,月相差,日相差,年:" + period1.getYears() + "  月:" + period1.getMonths() + "   日:" + period1.getDays()) ;

    System.out.println("年相差:"+ period1.get(ChronoUnit.YEARS)
    + "月相差:"+ period1.get(ChronoUnit.MONTHS)
    + "日相差:"+ period1.get(ChronoUnit.DAYS) );
  }

结果:

年相差,月相差,日相差,年:2012  月:12   日:24
年相差,月相差,日相差,年:1  月:4   日:7
年相差:1月相差:4日相差:7

Clock

代码示例

public static void clockDemo() {
    
    

    Clock clock = Clock.systemUTC();
    System.out.println("Clock : " + clock.millis());


    Clock defaultClock = Clock.systemDefaultZone();
    System.out.println("Clock : " + defaultClock.millis());

    System.out.println("当前时间戳:" + System.currentTimeMillis());
  }

运行结果

Clock : 1598240101472
Clock : 1598240101480
当前时间戳:1598240101480

DateTimeFormatter

代码示例:

public static void dateFomate() {
    
    
    LocalDateTime date = LocalDateTime.now();
    DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    //日期转字符串
    String str = date.format(format1);
    System.out.println("日期转换为字符串:" + str);
    DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    //字符串转日期
    LocalDateTime date2 = LocalDateTime.parse(str, format2);
    System.out.println("日期类型:" + date2);
  }

运行结果:

日期转换为字符串:2020/08/24 11:38:05
日期类型:2020-08-24T11:38:05

猜你喜欢

转载自blog.csdn.net/jianghuafeng0/article/details/108197394
今日推荐