• Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类


     下面将依次介绍

    1. Date转Java8时间类操作Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等)
    2. 解析不同时间字符串成对应的Java8中的类,如Instant、LocalDateTime、ZonedDateTime
    3. 时区ZoneId的使用场景、方式(根据ZoneId可将普通日期时间转化带有时区的日期时间,如2018-12-07T09:33:38Z,2018-10-08T18:12:38.547+08:00[Asia/Shanghai])。

    java.time包中的是类是不可变且线程安全的。

    新的时间及日期API位于java.time中,下面是一些关键类

    Instant——它代表的是时间戳,注意这里默认的Instant是0时区,比北京少8个时区,例子:2018-10-08T09:50:21.852Z,相当于当天北京时间的17:50:21.852

    LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

    LocalTime——它代表的是不含日期的时间

    LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。

    ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的,如:2018-10-08T18:12:38.547+08:00[Asia/Shanghai]。

    一个例子给出一个时间段,计算该时间范围由哪些日期(天)和月份组成

    一 、先主要是Java8中LocalDate日期的操作

    1. Date转LocalDate、LocalDateTime

    Date转化为Instant时间戳,然后instant和系统默认时区转化成LocalDate

    /**
         * Date转LocalDate: Date -> Instant + System default time zone = LocalDate
         */
        @Test
        public void dateToLocalDateAndLocalDateTime(){
            Date date = new Date();
            Instant instant = date.toInstant();
            /**
             * instant : 2018-10-08T09:50:21.852Z
             * Zone : UTC+0
             * 注意这里默认的Instant是比北京少8个时区
             */
    
    
            //获得本地默认时区
            ZoneId defaultZoneId = ZoneId.systemDefault();
    
            LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate();
            System.out.println(localDate);
         //2018-10-08 }

    Date转化成本地系统时区的LocalDateTime

    @Test
        public void dateToLocalDateTime(){
            Date date = new Date();
            Instant instant = date.toInstant();
            //系统默认的时区
            ZoneId zoneId = ZoneId.systemDefault();
            LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
            System.out.println(localDateTime);
        }

    2. 13位long类型转LocalDate

    long -> Instant +System default time zone = LocalDate

    public LocalDate longToLocalDate(Long time){
    
            //System Default TimeZone : Asia/Shanghai
            ZoneId defaultZoneId = ZoneId.systemDefault();
    
            //2018-01-04T16:00:00Z
            //时间戳
            Instant instant = Instant.ofEpochMilli(time);
    
            //2018-01-05
            LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate();
    
            return localDate;
        }

    3. 获取现在的日期

    Java8中有个叫LocalDate的类,能用来表示日期。这个类与java.util.Date略有不同,因为它只包含日期,没有时间。

    4. 获取年月日

    5. 判断两个日期之间相差多少天

    /**
         * 判断两个日期相差多少天
         */
        @Test
        public void localDateDiff(){
            LocalDate date1 = LocalDate.of(2018,9,20);
            LocalDate date2 = LocalDate.of(2018,10,3);
            long l = date2.toEpochDay() - date1.toEpochDay();
            System.out.println(l);
        }

    6. 获得某个日期所在月的第一天、最后一天

    /**
         * 获得某个日期所在月的第一天、最后一天
         */
        @Test
        public void firstLastDay(){
    
            LocalDate localDate = LocalDate.of(2018, 2, 22);
            LocalDate firstDay = localDate.with(TemporalAdjusters.firstDayOfMonth());
            LocalDate lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth());
            System.out.println("firstDay: "+firstDay+"  lastDay: "+lastDay);
            //firstDay: 2018-02-01  lastDay: 2018-02-28
        }

    7. 某个月有多少天

    先获取该月的最后一天的LocalDate,再调用getDayOfMonth()方法

     /**
         * 某个月有多少天
         */
        @Test
        public void getDayOfMonth(){
            LocalDate localDate = LocalDate.of(2018, 2, 22);
            LocalDate lastDay = localDate.with(TemporalAdjusters.lastDayOfMonth());
            int dayOfMonth = lastDay.getDayOfMonth();
            System.out.println(dayOfMonth);
            //28
        }

    8. 比较两个LocalDate的大小

    /**
         * 比较两个LocalDate的大小
         */
        @Test
        public void localDateCompareTo(){
            LocalDate date1 = LocalDate.of(2018,9,20);
            LocalDate date2 = LocalDate.of(2018,10,3);
            int i = date1.compareTo(date2);
            System.out.println(i);
            //-1 小
    
            int i1 = date2.compareTo(date1);
            System.out.println(i1);
            //1 大
    
            int i2 = date1.compareTo(date1);
            System.out.println(i2);
            //0 等于
        }

    9. 获取下一周的该星期、下个月的这天、下个月的1号

    /**
         * 获取下一周的该星期、下个月的这天、下个月的1号
         */
        @Test
        public void nextMonth(){
    
            LocalDate localDate = LocalDate.of(2018, 2, 12);
    
            //下一周的该星期
            LocalDate localDate1 = localDate.minusWeeks(-1);
            System.out.println(localDate1);
            //2018-02-19
    
            //获取下个月的这天
            LocalDate localDate2 = localDate.minusMonths(-1);
            System.out.println(localDate2);
            //2018-03-12
    
            //下个月的1号
            LocalDate localDate3 = LocalDate.of(localDate.getYear(), localDate.getMonthValue()+1, 1);
            System.out.println(localDate3);
            //2018-03-01
        }

    10. 比较两个LocalDate相差多少年、月、天

    Period这个类,这里比较的是两个日期,相差多少年、多少个月、多少天;

    比如下面的这个例子中,2018.10.9 比 2019.4.1相差 0年 5个月 23天

    /**
         * 比较两个LocalDate相差多少年、月、日
         */
        @Test
        public void localDatePeriod(){
            LocalDate date1 = LocalDate.of(2018,10,9);
            LocalDate date2 = LocalDate.of(2019,4,1);
            Period period = Period.between(date1, date2);
            int years = period.getYears();
            int months = period.getMonths();
            int days = period.getDays();
            System.out.println("years:"+years+", months:"+months+", days:"+days);
            //years:0, months:5, days:23
        }

    11. 通过10位或13位时间戳构建Instant

    ofEpochSecond()参数是10位时间戳,精确到秒;

    ofEpochMilli()参数是13位时间戳,精确到毫秒。

    @Test
        public void ofEpochSecond(){
            Instant now = Instant.now();
            System.out.println(now);
            //2019-03-13T06:41:32.865Z
    
            //去除毫秒
            long l = now.toEpochMilli() / 1000;
            //通过秒构建Instant对象
            Instant instant = Instant.ofEpochSecond(l);
            System.out.println(instant);
            //2019-03-13T06:41:32Z
        }

    二、 将特殊格式的字符串解析成对应的时间类

    由下面例子总结

    Instant只能解析"**T**Z”这种格式的时间,即UTC字符串;

    ZonedDateTime解析的时间字符串必须是要有年月日时分秒以及时区

    LocalDateTime解析的时间字符串必须要有年月日时分秒,但是不能有时区,例如末尾有"Z"的时间表示UTC的0时区就不能解析;

    LocalDate解析的时间字符串必须只能有年月日,格式如"2018-12-07",多任何其他字符都不能解析。

    1.格式:2018-12-07T09:33:38+00:00

    /**
         * 解析字符串:2018-12-07T09:33:38+00:00
         * ZonedDateTime必须解析有时区的时间
         */
        @Test
        public void stringToZonedDateTime(){
            final String string ="2018-12-07T09:33:38+00:00";
            ZonedDateTime parse = ZonedDateTime.parse(string);
            System.out.println(parse.toString());
            //结果是2018-12-07T09:33:38Z
            ZoneId zone = parse.getZone();
            System.out.println(zone);
        }

    2.2018-12-07T09:33:38Z

    /**
         * 解析字符串:2018-12-07T09:33:38Z,无法解析2018-12-07T09:33:38+00:00
         * Instant只能解析"**T**Z”这种格式的时间
         */
        @Test
        public void stringToInstant(){
            final String string ="2018-12-07T09:33:38Z";
            Instant parse = Instant.parse(string);
            System.out.println(parse);
            //2018-12-07T09:33:38Z
        }
    /**
         * 解析字符串:2018-12-07T09:33:38Z
         * 表示的是0时区的时间
         */
        @Test
        public void stringToZonedDateTime1(){
            final String string ="2018-12-07T09:33:38Z";
            ZonedDateTime parse = ZonedDateTime.parse(string);
            System.out.println(parse.toString());
            //结果是2018-12-07T09:33:38Z
            ZoneId zone = parse.getZone();
            System.out.println(zone);
        }

    3.2018-12-07T09:33:38,末尾无Z,没有时区

     /**
         * 解析字符串:2018-12-07T09:33:38,末尾不能有Z,有T有Z代表了UTC 0时区的时间,还必须要有"T时分秒"这一截字符串
         * LocaDateTime无法解析带有时区的字符串时间
         */
        @Test
        public void stringToLocalDateTime(){
            final String string ="2018-12-07T09:33:38";
            LocalDateTime parse = LocalDateTime.parse(string);
            System.out.println(parse.toString());
            //结果是2018-12-07T09:33:38
        }

    4.2018-12-07

    /**
         * 解析字符串:2018-12-07,只能解析该格式字符串
         * LocaDate无法解析带有时区的字符串时间
         */
        @Test
        public void stringToLocalDate(){
            final String string ="2018-12-07";
            LocalDate parse = LocalDate.parse(string);
            System.out.println(parse.toString());
            //结果是2018-12-07
    
        }

    三、 时区ZoneID相关操作

    ZoneID.of(String zoneId) 时区参数

    这里的zoneId字符串可以传入"Asia/Shanghai",字符串如下:

    • EST - -05:00
    • HST - -10:00
    • MST - -07:00
    • ACT - Australia/Darwin
    • AET - Australia/Sydney
    • AGT - America/Argentina/Buenos_Aires
    • ART - Africa/Cairo
    • AST - America/Anchorage
    • BET - America/Sao_Paulo
    • BST - Asia/Dhaka
    • CAT - Africa/Harare
    • CNT - America/St_Johns
    • CST - America/Chicago
    • CTT - Asia/Shanghai
    • EAT - Africa/Addis_Ababa
    • ECT - Europe/Paris
    • IET - America/Indiana/Indianapolis
    • IST - Asia/Kolkata
    • JST - Asia/Tokyo
    • MIT - Pacific/Apia
    • NET - Asia/Yerevan
    • NST - Pacific/Auckland
    • PLT - Asia/Karachi
    • PNT - America/Phoenix
    • PRT - America/Puerto_Rico
    • PST - America/Los_Angeles
    • SST - Pacific/Guadalcanal
    • VST - Asia/Ho_Chi_Minh

    将不带时区LocalDateTime转化为带时区的ZonedDateTime

    /**
         * 把无时区的时间LocaDateTime解析成有时区的ZonedDateTime
         */
        @Test
        public void localDateTimeToZonedDateTime(){
            final String string ="2018-12-07T09:33:38";
            LocalDateTime parse = LocalDateTime.parse(string);
            ZonedDateTime z1 = ZonedDateTime.of(parse, ZoneId.of("Asia/Shanghai"));
            System.out.println(z1.toString());
            //2018-12-07T09:33:38+08:00[Asia/Shanghai]
    
            ZonedDateTime z2 = ZonedDateTime.of(parse, ZoneId.of("Z"));
            System.out.println(z2.toString());
            //2018-12-07T09:33:38Z
    
            ZonedDateTime z3 = ZonedDateTime.of(parse, ZoneId.of("UTC"));
            System.out.println(z3.toString());
            //2018-12-07T09:33:38Z[UTC]
    
            ZonedDateTime z4 = ZonedDateTime.of(parse, ZoneId.of("UTC+08:00"));
            System.out.println(z4.toString());
            //2018-12-07T09:33:38+08:00[UTC+08:00]
    
            ZonedDateTime z5 = ZonedDateTime.of(parse, ZoneId.of("+08:00"));
            System.out.println(z5.toString());
            //2018-12-07T09:33:38+08:00
    
            ZonedDateTime z6 = ZonedDateTime.of(parse, ZoneId.of("+00:00"));
            System.out.println(z6.toString());
            //2018-12-07T09:33:38Z
    
        }

    由结果可知,String zoneId的字符串值,如果为:

    "Asia/Shanghai"例子为"2018-12-07T09:33:38+08:00[Asia/Shanghai]" ;

    "Z"和"+00:00"表示的是"2018-12-07T09:33:38Z"这种格式的时间;

    "UTC"表示的是"2018-12-07T09:33:38Z[UTC]" ;

    "UTC+08:00" 例子:"2018-12-07T09:33:38+08:00[UTC+08:00]" ;

    "+08:00" 例子:"2018-12-07T09:33:38+08:00"

    部分参考:

    https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html

    http://www.mkyong.com/java8/java-8-convert-date-to-localdate-and-localdatetime/

    https://www.cnblogs.com/comeboo/p/5378922.html

    给出一个时间段,计算该时间范围由哪些天和月组成

  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/theRhyme/p/9756154.html
Copyright © 2020-2023  润新知