百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

JAVA8时间操作总结(jdk8时间类)

wxin55 2024-11-03 15:37 9 浏览 0 评论

Java8处理日期总结

Java8对lambda、streams做了优化,也推出了全新的处理时间API,明确了时间概念,如:instant(瞬时),duration(长短)、日期、时间、时区和周期,和老版本不同的是,新的API是以IOS为标准日历系统的,java.time下的所有类都是线程安全的。

关键API

  • ZonedDateTime:最完整的日期和时间,包含有相对UTC和时区已经格林威治时差。
  • LocalDateTime:不包含时差和时区信息。
  • LocalTime:包含时间,但是没有日期。
  • LocalDate:当地日期,不包含具体时间。
  • Instant:瞬时实例。
  • 代码实现

    主要通过一些简单的代码实例去学习Java8中的时间API,只有项目才是学习新知识最有效的方式。

    使用LocalDate获取当前时间已经年、月、日信息

    LocalDate表示当前本地的时间,但是只包含日期,没有时间

      /**
         * 获取当前时间已经年月日信息
         */
        public static void getNowDate(){
            //只获取日期
            LocalDate now = LocalDate.now();
            System.out.println("本地时间只有年月日:"+now);
            Date date = new Date();
            System.out.println("Java.Util.Date获取时间:"+date);
            int year = now.getYear();
            int monthValue = now.getMonthValue();
            int dayOfMonth = now.getDayOfMonth();
            System.out.printf("年 : %d  月 : %d  日 : %d t %n",year,monthValue,dayOfMonth);
        }
    

    结果

    本地时间只有年月日:2021-01-26
    Java.Util.Date获取时间:Tue Jan 26 21:33:07 CST 2021
    年 : 2021  月 : 1  日 : 26 t 
    

    使用LocalDate获取特定时间

    LocalDate.of()可以创建任意时间,只有输入年月日参数即可,不像之前的Java API起始时间是1900,月份从0开始。

        /**
         * 处理特点的时间根据年月日
         * @param year
         * @param month
         * @param day
         */
        public static void setSpecilDate(int year,int month,int day) {
            LocalDate date = LocalDate.of(year, month, day);
            System.out.println("设置时间为 :"+date);
        }
    

    结果

    设置时间为 :2021-1-26
    

    使用equals判断两个日期是否相等

    在现实项目中进程会遇到判断两个日期是否相等,LocalDate重载了 equal方法使得她们可以进行比较

     /**
         * 判断两个日期是否equals
         */
        public static void compareLocalDate(){
            LocalDate now = LocalDate.now();
            LocalDate date = LocalDate.of(2020, 12, 26);
            boolean equals = now.equals(date);
            String result =equals?"相等":"不相等";
            System.out.printf("时间now %s 和 时间date %s  %s \n", now, date,result);
        }
    

    结果

    时间now 2021-1-26 和 时间date 2021-1-26  相等 
    

    使用MonthDay检查年周期性时间

    在实际项目中,我们经常会遇到一些周期性的事件,例如生日、结婚纪念日或者每月定时给客户发送邮件等事件,在Java8中使用MonthDay类,实现了月份和日的组合,这样就可以判断每年都会发生的事件了

        /**
         * 处理一年只发生一次的事情
         */
        public static void cycleDate(){
            //获取当前时间
            LocalDate now = LocalDate.now();
            //设置特点时间
            LocalDate date = LocalDate.of(2020, 1, 26);
            //获取月份和日期
            MonthDay monthDay = MonthDay.of(date.getMonth(), date.getDayOfMonth());
            //获取当前时间的月份和日期
            MonthDay currentDay = MonthDay.from(now);
            String equals = currentDay.equals(monthDay)?"是":"不是";
            System.out.printf("时间now %s 和 时间date %s  %s 周期循环日 \n", now, date,equals);
        }
    

    结果

    时间now 2021-01-26 和 时间date 2020-01-26  是 周期循环日 
    

    使用LocalTime获取当前时间(只有时间没有年月日),已经对时间进行加减操作

    LocalTime可是使用静态工厂方法LocalTime.now()获取当前时间。默认格式是hh:mm:ss:nm。

        /**
         * 对时间进行加减操作
         */
        public static void operatDate(){
            LocalTime localTime = LocalTime.now();
            LocalTime time = localTime.plusHours(-1).plusMinutes(1).plusSeconds(30);
            System.out.printf("当前时间是 %s 和 加减操作后的时间 %s  \n", localTime, time);
        }
    

    结果

    当前时间是 22:03:52.522 和 加减操作后的时间 21:05:22.522  
    

    计算N周、N月或者N年前、后的日期


      /**
         * 对LocalDate时间进行加减操作
         */
        public static void operatLocalDateDate(){
            LocalDate today = LocalDate.now();
            LocalDate previousYear = today.plusYears(-1).plusMonths(1).plusDays(1).plusWeeks(-1);
            LocalDate previousYear1 = today.minusYears(1).plusMonths(1).plusDays(1).minusWeeks(1);
            String result =previousYear.equals(previousYear1)?"相等":"不相等";
            System.out.printf("previousYear时间 %s 和 previousYear1时间  %s  %s \n", previousYear, previousYear1,result);
        }
    

    结果:可见不同的操作有相同的结果,对时间进行操作要多思考

    previousYear时间 2020-02-20 和 previousYear1时间  2020-02-20  相等 
    

    判断连个日期的早晚

    在LocalDate中包含isBefore()和isAfter比较日期比较

    /**
         * 判断两个日期的早晚
         */
     public  static  void isBeforeOrAfter(){
         LocalDate now = LocalDate.now();
         LocalDate plusDays = now.plusDays(1);
         String beforeSrt = now.isBefore(plusDays)?"是":"不是";
         String afterSrt = plusDays.isAfter(now)?"是":"不是";
         System.out.printf("时间 %s %s  在时间  %s  之前 \n",now, beforeSrt, plusDays);
         System.out.printf("时间 %s %s  在时间  %s  之后 \n",plusDays, afterSrt, now);
     }
    

    结果

    时间 2021-01-26 是  在时间  2021-01-27  之前 
    时间 2021-01-27 是  在时间  2021-01-26  之后 
    

    使用Period计算两个日期之间的天数和月数

       /**
         * 计算日期相差天数和月数
         */
     public  static void clacDateDays(){
         LocalDate now = LocalDate.now();
         LocalDate plusMonths = now.plusMonths(2).plusDays(-1);
         Period between = Period.between(now, plusMonths);
         System.out.printf("时间 %s 和时间  %s  相差 %s 月   %s天 \n",now, plusMonths,between.getMonths(), between.getDays());
     }
    

    结果

    时间 2021-01-26 和时间  2021-03-25  相差 1 月   27天 
    

    获取时间戳

        /**
         * 获取时间戳
         */
        public  static void getTimestamp(){
            Instant now = Instant.now();
            System.out.println(now);
        }
    

    总结:

    今天介绍Java8中日期和是时间API,主要介绍了LocalDate和LocalTime类,这些API都是线程安全的,而Date和Calendr类都是 是非线程安全的,介绍的可能不是很全还请一起探讨!

    喜欢我的可以进行关注,谢谢

    相关推荐

    ES6中 Promise的使用场景?(es6promise用法例子)

    一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

    JavaScript 对 Promise 并发的处理方法

    Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

    Promise的九大方法(promise的实例方法)

    1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

    360前端一面~面试题解析(360前端开发面试题)

    1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

    前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

    Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

    最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

    看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

    前端分享-Promise可以中途取消啦(promise可以取消吗)

    传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

    手写 Promise(手写输入法 中文)

    前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

    什么是 Promise.allSettled()!新手老手都要会?

    Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

    前端面试-关于Promise解析与高频面试题示范

    Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

    宇宙厂:为什么前端离不开 Promise.withResolvers() ?

    大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

    Promise 新增了一个超实用的 API!

    在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

    一次搞懂 Promise 异步处理(promise 异步顺序执行)

    PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

    Promise 核心机制详解(promise机制的实现原理)

    一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

    javascript——Promise(js实现promise)

    1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

    取消回复欢迎 发表评论: