53_可变字符串类和日期相关类

59 篇文章 2 订阅
13 篇文章 0 订阅

可变字符串类和日期相关类

可变字符串类(重点)

  1. 基本概念

    • 由于String类描述的字符串内容是个常量数值不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间和时间的浪费,因为用过一次之后就可能不再用就要销毁了。
    • 为了解决上述问题,可以使用java.lang.StringBuilder类java.lang.StringBuffer类描述字符序列可以改变的字符串,如:“ab”。这个就是在一块内存空间中对类似的内容来回调整就行,就不需要大量的申请内存,释放内存等等,避免了内存空间的浪费,也节省了大量创建对象、释放内存空间的时间。
    • StringBuffer类是从jdk1.0开始存在,属于线程安全(一个一个的排队进行)的类,因此效率比较低
    • StringBuilder类是从jdk1.5开始存在,属于非线程安全(争抢资源,一拥而上)的类,效率比较高。暂时不涉及到线程问题,不用考虑多线程,我们就首选StringBuilder(效率比较高)。而StringBuffer和StringBuilder在API中的方法基本上是一模一样的。
    • 总结:String类是用来描述不可改变的字符串常量的,StringBuffer和StringBuilder是描述可以改变。Buffer是安全效率低,Builder是不安全效率高。(笔试考点:String、StringBuffer和StringBuilder三者之间的区别
  2. StringBuilder 类常用的构造方法

    方法声明功能介绍
    StringBuilder()使用无参方式构造对象,容量为16(申请了一块内存空间,可以放16个字符) 不想指定容量也不想指定初始值时
    StringBuilder(int capacity)根据参数指定的容量来构造对象,容量为参数指定大小 只想指定容量时
    StringBuilder(String str)根据参数指定的字符串来构造对象,容量为:16+字符串长度 只想指定初始值时
  3. StringBuilder 类常用的成员方法:增删改查反转操作

    方法声明功能介绍
    int capacity()用于返回调用对象的容量
    int length()用于返回字符串的长度,也就是字符的个数 length()<= capacity()
    StringBuilder insert(int offset, String str)插入字符串并返回调用对象的引用,就是自 己。
    StringBuilder append(String str)追加字符串
    StringBuilder deleteCharAt(int index)将当前字符串中下标为index位置的单个字符 删除,每当删除一个字符后后面的字符会向前补位
    StringBuilder delete(int start,int end)删除字符串(其实下标包含,结束下标不包含)
    StringBuilder replace(int start,int end, String str)替换字符串,包含起始下标,不包含结束下标
    setCharAt(int index, char ch)指定索引处的字符设置为ch,和deleteCharAt很像
    StringBuilder reverse()字符串反转
    • 注意

      作为参数传递的话,方法内部String(描述的是常量不可改变的内容)不会改变其值,StringBuffer和StringBuilder(描述的是字符序列可以改变的内容)会改变其值

      查找方法和String类中的是一样的 cahrAt、indexOf、lastIndexOf,还有String类中的substring方法

  4. 返回值的设计

    • StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。
    • 由此可见,这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。基 于这样设计的目的在于可以连续调用。
  5. 练习代码

    package com.huang.task03;
    
    public class StringBuilderTest {
    
        public static void main(String[] args) {
    
            // 1.使用无参方式构造StringBuilder类型的对象并打印容量和长度
            StringBuilder sb1 = new StringBuilder();
            System.out.println("sb1 = " + sb1); // 自动调用toString方法 啥也没有
            System.out.println("容量是:" + sb1.capacity()); // 16
            System.out.println("长度是:" + sb1.length()); // 0
    
            System.out.println("-----------------------------------------------------------");
            // 2.使用参数指定的容量来构造对象并打印容量和长度
            StringBuilder sb2 = new StringBuilder(20);
            System.out.println("sb2 = " + sb2); // 自动调用toString方法 啥也没有
            System.out.println("容量是:" + sb2.capacity()); // 20
            System.out.println("长度是:" + sb2.length()); // 0
    
            System.out.println("-----------------------------------------------------------");
            // 3.根据参数指定的字符串内容来构造对象并打印容量和长度
            StringBuilder sb3 = new StringBuilder("hello");
            System.out.println("sb3 = " + sb3); // 自动调用toString方法  hello
            System.out.println("容量是:" + sb3.capacity()); // 16 + 5 = 21
            System.out.println("长度是:" + sb3.length()); // 5
    
            System.out.println("-----------------------------------------------------------");
            String str1 = new String("hello");
            String str2 = str1.toUpperCase();
            System.out.println("str2 = " + str2); // HELLO
            System.out.println("str1 = " + str1); // hello  字符串本身是个常量不会改变
    
            // 4.实现向字符串中插入和追加字符串内容
            // 向下标为0的位置插入字符串内容"abcd",也就是向开头位置插入字符串内容
            StringBuilder sb4 = sb3.insert(0, "abcd");
            System.out.println("sb4 = " + sb4); // abcdhello  返回调用对象自己的引用,也就是返回值和调用对象是同一个字符串
            // 无论返回值还是调用对象都是一个对象
            System.out.println("sb3 = " + sb3); // abcdhello
            // 向中间位置插入字符串"1234"
            sb3.insert(4, "1234");
            System.out.println("sb3 = " + sb3); // abcd1234hello
            // 向末尾位置插入字符串"ABCD"
            sb3.insert(sb3.length(), "ABCD");
            System.out.println("sb3 = " + sb3); // abcd1234helloABCD
    
            System.out.println("-----------------------------------------------------------");
            // 向末尾位置追加字符串内容
            sb3.append("world");
            System.out.println("sb3 = " + sb3); // abcd1234helloABCDworld       字符串个数:22,超过了初始容量
            // 当字符串的长度超过了字符串对象的初始容量时,该字符串对象会自动扩容,默认扩容算法是:原始容量*2 + 2 => 21*2 + 2 => 44
            // ensureCapacityInternal(count + len); 确保容量是足够的,说白了来说也就是扩容算法   count代表字符的个数
            // 扩容算法底层就是通过Arrays.copyOf()来实现的
            // 真正扩容的算法:new Capacity(int 初始容量)方法中的 int newCapacity = (oldCapacity << 1) + 2; // 左移一位就是乘以2
            // 移位运算符的价值:在源码中,移位运算符的效率很高,直接拿着二进制位进行移动,左移1相当于*2,右移1相当于/2
            // 底层采用byte数组来存放所有的字符内容。  String、StringBuffer、StringBuilder都是
            // ctrl+alt+左右方向键  表示回到上/下一个位置
            System.out.println("容量是:" + sb3.capacity()); // 44
            System.out.println("长度是:" + sb3.length()); // 22
    
            System.out.println("-----------------------------------------------------------");
            // 5.实现字符串中字符和字符串的删除
            // 表示删除下标为8的单个字符
            sb3.deleteCharAt(8);
            System.out.println("sb3 = " + sb3); // abcd1234elloABCDworld
            // 使用for循环删除多个字符
            for (int i = 8; i < 12; i++) { // 这个表示从下表为8开始一直删到12,但是取不到12
                // 由结果可知:删除一个字符后就跳过一个字符继续删除,因为每当删除一个字符后后面的字符会向前补位,因为下标会发生变化
                //sb3.deleteCharAt(i); abcd1234loBDworld
                // 始终删除下标为8的字符
                sb3.deleteCharAt(8);
            }
            System.out.println("删除后的字符串是:" + sb3); // abcd1234ABCDworld
    
            System.out.println("-----------------------------------------------------------");
            // 删除起始字符串abcd,包含0但不包含4
            sb3.delete(0, 4);
            System.out.println("sb3 = " + sb3); // 1234ABCDworld
            // 删除中间字符串
            sb3.delete(4, 8);
            System.out.println("sb3 = " + sb3); // 1234world
            // 删除末尾字符串
            sb3.delete(4, sb3.length()); // 取不到长度,表示范围是[4,sb3.length()-1]
            System.out.println("sb3 = " + sb3); // 1234
    
            System.out.println("-----------------------------------------------------------");
            // 6.实现字符串内容的修改、查找以及反转操作
            // 查找方法和String类中的是一样的
            // 表示将下标为0这个位置的字符修改为'a'
            sb3.setCharAt(0, 'a');
            System.out.println("修改单个字符后的内容是:" + sb3); // a234
            // 修改"234"为"bcd"
            sb3.replace(1, 4, "bcd");
            System.out.println("修改字符串后的结果是:" + sb3); // abcd
            // 实现查找的功能
            int pos = sb3.indexOf("b");
            System.out.println("从前向后查找的结果是:" + pos); // 1
            pos = sb3.lastIndexOf("b");
            System.out.println("从后向前查找的结果是:" + pos); // 1
            // 实现字符串的反转功能
            sb3.reverse();
            System.out.println("反转后的结果是:" + sb3); // dcba
    
            System.out.println("-----------------------------------------------------------");
            
        }
    }
    
    
  6. 笔试考点

    // 7.笔试考点
    // 考点一:既然StringBuilder类的对象本身可以修改,那么为什么成员方法还有返回值呢?并且返回的还是自己
    // 解析:为了连续调用,连续调用多个方法
    // 拿着一个引用变量可以连续不停的调用多个方法实现各种功能,然后都写到一起
    //sb3.reverse().append("1").append("2").insert(0, "3").delete(0, 1).reverse();
    
    
    // 考点二:如何实现StringBuilder类型和String类型之间的转换呢?
    //String str3 = sb3.toString();
    //StringBuilder sb5 = new StringBuilder(str3);
    
    
    // 考点三:String、StringBuilder、StringBuffer之间效率谁高?排列如何?
    // String < StringBuffer < StringBuilder
    // String对象存放的是常量,只要稍稍动一下就需要重新new对象申请内存
    // StringBuffer可以在原始字符串本身进行调整,省略了新建对象申请内存的一系列操作,效率肯定高于String类
    // 从效率上来看,我们优先使用StringBuilder
    

Java8之前的日期相关类(熟悉)

  1. System类概述(系统)

    1. 基本概念:Java.lang.System类中提供了一些有用的类字段和方法。System.out:标准输出;System.in:标准输入;Sytem.arrayCopy():拷贝数组

    2. 常用的方法

      方法声明功能介绍
      static long currentTimeMillis()返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
    3. 练习代码

      package com.huang.task03;
      
      /**
       * @author hhc19
       * @date 2022/1/5 20:14
       * @description
       */
      public class SystemTest {
      
          public static void main(String[] args) {
      
              // 1、获取当前系统时间距离1970年1月1日0时0分0秒的毫秒数
              long msec = System.currentTimeMillis();
              System.out.println("当前系统时间距离1970年1月1日0时0分0秒已经过去" + msec + "毫秒了!"); // 1641385131985
      
              // 在我们开发时通常用于测试一段代码的执行效率:时间差来判断算法的效率问题。
          }
      }
      
      
  2. Date类的概述(日期类)

    1. 基本概念:java.util.Date类主要用于描述特定的瞬间,也就是年月日时分秒可以精确到毫秒

    2. 常用的方法

      方法声明功能介绍
      Date()使用无参的方式构造对象,也就是当前系统时间
      Date(long date)根据参数指定毫秒数构造对象, 参数为距离1970年1月1日0时0分0秒 的毫秒数
      long getTime()获取调用对象距离1970年1月1日0时0分0秒的毫秒数
      void setTime(long time)设置调用对象为距离基准时间time毫秒的时间点
      package com.huang.task03;
      
      import java.util.Date;
      
      public class DateTest {
      
          public static void main(String[] args) {
      
              // 1.使用无参方式构造Date对象并打印
              Date d1 = new Date();
              System.out.println("d1 = " + d1); // 获取当前系统时间
      
              System.out.println("------------------------------------");
              // 2.使用参数指定的毫秒数来构造Date对象并打印  1秒 = 1000毫秒  东八区
              // 1970年1月1日0时0分0秒     可以用System.currentTimeMillis()大的返回值作为参数
              Date d2 = new Date(1000);
              // 多了八个小时,因为我们现在所处的时区是东八区,差了8小时,所以它这里自动的帮我们加了八小时
              // 因为这里默认算的是标准的时区,就是因为时区的原因多了8小时
              System.out.println("d2 = " + d2); // 1970 1 1 8 0 1
      
              System.out.println("------------------------------------");
              // 3.获取调用对象距离1970年1月1日0时0分0秒的毫秒数
              long msec = d2.getTime(); // 调用的时间不一定是当前时间
              System.out.println("获取到的毫秒数是:" + msec); // 1000
      
              // 4.设置调用对象所表示的时间点为参数指定的毫秒数
              // 设置调用对象为距离基准时间time(1970年1月1日0时0分0秒)毫秒的时间点
              d2.setTime(2000);
              System.out.println("修改后的时间是:" + d2); // 1970 1 1 8 0 2
          }
      }
      
      
  3. SimpleDateFormat类的概述

  4. 基本概念:java.text.SimpleDateFormat类主要用于实现日期和文本之间格式的转换。简单日期格式类。我们现阶段主要用到的包是lang包、util包。我们只要知道不是lang的包import导入就行了。

  5. 常用方法

    方法声明功能介绍
    SimpleDateFormat()使用无参方式构造对象
    SimpleDateFormat(String pattern)根据参数指定的模式来构造对象,模式主要有: y-年 M-月 d-日 H-时 m-分 s-秒
    final String format(Date date)用于将日期类型转换为文本类型(实现日期和文本之间进行转换)
    Date parse(String source)用于将文本类型转换为日期类型(将文本转换为日期,与上互逆)
    package com.huang.task03;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class SimpleDateFormatTest {
    
        public static void main(String[] args) throws Exception {
    
            // 1.获取当前系统时间并打印
            Date d1 = new Date();
            System.out.println("d1 = " + d1);
    
            // 2.构造SimpleDateFormat类型的对象并指定格式
            // SimpleDateFormat sdf = new SimpleDateFormat("gggg-MM-dd HH:mm:ss"); // IllegalArgumentException: Illegal pattern character 'g'
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
            // 只能使用 y/Y 代表年 Y代表4个y,M 代表月,d/D 代表日,H 代表24小时 h代表12小时,m 代表分钟,s 代表秒 a 表示是上午或者下午
    
            // 3.实现日期类型向文本类型的转换并打印
            // alt+Enter 可以实现返回值的生成
            String format = sdf.format(d1);
            System.out.println("转换后的日期为:" + format);
            // 4.实现文本类型到日期类型的转换并打印
            Date parse = sdf.parse(format);
            System.out.println("转回日期格式的结果为:" + parse);
        }
    }
    
    
    SimpleDateFormat类就是为了实现 日期 和 文本 之间格式的相互转换操作。
    
  6. Calendar类的概述

    1. 基本概念

      • java.util.Calender类主要用于描述特定的瞬间取代Date类中的过时方法实现全球化
      • 该类是个抽象类,因此不能实例化对象,其具体子类针对不同国家的日历系统,其中应用最广泛的 是GregorianCalendar(格里高利历),对应世界上绝大多数国家/地区使用的标准日历系统
    2. 常用的方法

      方法声明功能介绍
      static Calendar getInstance()用于获取Calendar类型的引用
      void set(int year, int month, int date, int hourOfDay, int minute, int second用于设置年月日时分秒信息
      Date getTime()用于将Calendar类型转换为 Date类型
      void set(int field, int value)设置指定字段的数值
      void add(int field, int amount)向指定字段增加数值
      package com.huang.task03;
      
      import java.text.SimpleDateFormat;
      import java.util.Calendar;
      import java.util.Date;
      
      public class CalendarTest {
      
          public static void main(String[] args) {
      
              // 1.使用过时的方法按照指定的年月日时分秒来构造对象
              // 使用这个构造方法:年份要减去1900,月份要减去1
              Date d1 = new Date(2008-1900, 8-1, 8, 20, 8, 8);
              // 2.设置日期对象的格式并打印
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              String format = sdf.format(d1);
              System.out.println("获取到的时间是:" + format); // 2008 8 8 20 8 8
      
              System.out.println("-----------------------------------------------------");
              // 2.使用取代的方式按照指定的年月日时分秒来构造对象
              // 2.1 获取Calendar类型的引用
              // 考点:既然Calendar是个抽象类不能创建对象,那么下面的方法为啥可以获取Calendar类型的引用呢?
              // 解析:由源码可知,返回的并不是Calendar类型的对象,而是Calendar类的子类GregorianCalendar等对象,形成了多态
              // 多态的使用场合之三:通过返回值类型形成多态
              Calendar instance = Calendar.getInstance();
              // 2.2 设置指定的年月日时分秒信息
              // 它这里月份是 0 - 11,我们要使用正确的月份-1,月份的值基于0,0代表1月份
              instance.set(2008, 8-1, 8, 20, 8, 8);
              // 2.3 转换为Date类型的对象
              Date d2 = instance.getTime();
              String format1 = sdf.format(d2);
              System.out.println("获取到的时间是:" + format1); // 2008 8 8 20 8 8
              // 第一种方式虽然简单,但是不支持全球化,第二种方法虽然复杂,代码越写越多,但是支持全球化。有舍即有得。付出的代价就是代码越写越多,但是可以让很多国家都可以使用。
              // 在这两种方式中,我们要选择第二种方式,因为第一种方式已经过时了,搞不好哪天就没了。
      
              System.out.println("-----------------------------------------------------");
              // 3.向指定的字段设置以及增加指定的数值
              // 给年月日时分秒中指定的字段设置一个指定的值
              instance.set(Calendar.YEAR, 2018);
              // 转换为Date类型并按照指定的格式打印
              Date d3 = instance.getTime();
              System.out.println("设置年份后的结果是:" + sdf.format(d3)); // 2018 8 8 20 8 8
      
              // 给指定的字段加上指定的值
              instance.add(Calendar.MONTH, 2);
              // 第二个参数如果为负数就是在原有基础上-xxx,比如月份上-12会让年-1
              Date d4 = instance.getTime();
              System.out.println("增加月份后的结果是:" + sdf.format(d4)); // 2018 10 8 20 8 8
          }
      }
      
      
    3. 笔试考点:既然Calendar是个抽象类不能创建对象,那么下面的方法为啥可以获取Calendar类型的引用呢?

      解析:由源码可知,返回的并不是Calendar类型的对象,而是Calendar类的子类GregorianCalendar等对象,形成了多态
      多态的使用场合之三:通过返回值类型形成多态

    4. 多态的使用场合(3种)

      1、通过方法的参数传递形成多态;
      public static void draw(Shape s){
       s.show();
      }
      draw(new Rect(1, 2, 3, 4));
      
      2、在方法体中直接使用多态的语法格式:抽象类/接口类型引用指向子类/实现类对象
      Account acc = new FixedAccount();
      
      3、通过方法的返回值类型形成多态
      Calender getInstance(){
       return new GregorianCalendar(zone, aLocale);
       }
      

Java8中的日期相关类(熟悉)

  1. Java8日期类的由来

    从Java8开始Java官方又提供了一套相关的API

    JDK 1.0中包含了一个java.util.Date类(没有考虑到全球化问题,很多功能都不通用,很多方法都过时了),但是它的大多数方法已经在JDK 1.1引入Calendar类之后被 弃用 了。而Calendar并不比Date好多少。它们面临的问题是:

    • Date类中的年份是从1900开始的,而月份都从0开始。 Calendar年份不用减了,但是月份依旧从0开始。
    • 格式化只对Date类有用,对Calendar类则不能使用
    • 非线程安全等。
  2. Java8日期类的概述

    • Java 8通过发布新的Date-Time API来进一但是步加强对 日期与时间的处理。Java8版本对日期相关类来说是一个质的飞越。但是这两套API都要会,万一用到了要快速的反应过来,能找到。
    • java.time包:该包日期/时间API基础包
    • java.time.chrono包:该包提供对不同日历系统的访问。 兼容问题
    • java.time.format包:该包能够格式化和解析日期时间对象。
    • java.time.temporal包:该包包含底层框架和扩展特性
    • java.time.zone包:该包支持不同时区以及相关规则的类。
  3. LocalDate类的概述

    1. 常用概念:java.time.LocalDate类主要用于描述年-月-日格式的日期信息,该类不表示时间(时分秒信息)和时区信息

    2. 常用的方法

      方法声明功能介绍
      static LocalDate now()在默认时区中从系统时钟获取当前日期
  4. LocalTime类的概述

    1. 基本概念:java.time.LocalTime 类主要用于描述时间(时分秒)信息,可以描述时分秒以及纳秒

    2. 常用方法

      方法声明功能介绍
      static LocalTime now()从默认时区的系统时间中获取当前时间
      static LocalTime now(ZoneId zone)获取指定时区的当前时间
  5. LocalDateTime类的概述

    1. 基本概念:java.time.LocalDateTime类主要用于描述ISO-8601日历系统中没有时区的日期时间,如2007-12- 03T10:15:30。年月日时分秒。

    2. 常用的方法:获得、设置、加上、减去 日期时间

      方法声明功能介绍
      static LocalDateTime now()从默认时区的系统时间中获取 当前日期时间
      static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)根据参数指定的年月日时分秒 信息来设置日期时间
      int getYear()获取年份字段的数值
      int getMonthValue()获取1到12之间的月份字段
      int getDayOfMonth()获取日期字段
      int getHour()获取小时数
      int getMinute()获取分钟数
      int getSecond()获取秒数
      LocalDateTime withYear(int year)设置为参数指定的年
      LocalDateTime withMonth(int month)设置为参数指定的月
      LocalDateTime withDayOfMonth(int dayOfMonth)设置为参数指定的日
      LocalDateTime withHour(int hour)设置为参数指定的时
      LocalDateTime withMinute(int minute)设置为参数指定的分
      LocalDateTime withSecond(int second)设置为参数指定的秒
      LocalDateTime plusYears(long years)加上参数指定的年
      LocalDateTime plusMonths(long months)加上参数指定的月
      LocalDateTime plusDays(long days)加上参数指定的日
      LocalDateTime plusHours(long hours)加上参数指定的时
      LocalDateTime plusMinutes(long minutes)加上参数指定的分
      LocalDateTime plusSeconds(long seconds)加上参数指定的秒
      LocalDateTime minusYears(long years)减去参数指定的年
      LocalDateTime minusMonths(long months)减去参数指定的月
      LocalDateTime minusDays(long days)减去参数指定的日
      LocalDateTime minusHours(long hours)减去参数指定的时
      LocalDateTime minusMinutes(long minutes)减去参数指定的分
      LocalDateTime minusSeconds(long seconds)减去参数指定的秒
      package com.huang.task03;
      
      import java.time.LocalDate;
      import java.time.LocalDateTime;
      import java.time.LocalTime;
      
      public class LocalDateTimeTest {
      
          public static void main(String[] args) {
      
              // 1.获取当前日期信息并打印:如果以后只是单独的用日期
              LocalDate now = LocalDate.now();
              System.out.println("获取到的当前日期是:" + now); // 只有日期:2022-01-06
              // 2.获取当前时间信息并打印:如果以后只是单独的用时间
              LocalTime now1 = LocalTime.now();
              System.out.println("获取到的当前时间是:" + now1); // 只有时间:15:18:30.979290200
              // 3.获取当前日期时间信息并打印,使用最多;是上面两个的综合:度过以后既要用日期又要用时间
              LocalDateTime now2 = LocalDateTime.now();
              System.out.println("获取到的当前日期时间是:" + now2); // 既有日期又有时间:2022-01-06T15:18:30.980291900
      
              System.out.println("-------------------------------------------------------");
              // 4.使用参数指定的年月日时分秒信息来获取对象并打印
              // 使用ctrl+F12来查找指定的方法
              LocalDateTime of = LocalDateTime.of(2008, 8, 8, 20, 8, 8);
              System.out.println("指定的日期时间是:" + of); // 自动调用toString方法
              System.out.println("获取到的年是:" + of.getYear()); // 2008
              System.out.println("获取到的月是:" + of.getMonthValue()); // 8 getMonthValue返回的是数字   getMonth返回的是枚举
              System.out.println("获取到的日是:" + of.getDayOfMonth()); // 8
              System.out.println("获取到的时是:" + of.getHour()); // 20
              System.out.println("获取到的分是:" + of.getMinute()); // 8
              System.out.println("获取到的秒是:" + of.getSecond()); // 8
      
              System.out.println("-------------------------------------------------------");
              // 5.实现特征的设置并打印
              // 与String类型相似,调用对象本身的数据内容不会改变,返回值相当于创建了一个新的对象,由此证明了不可变性
              // 调用对象本身的原始数据没变
              LocalDateTime localDateTime = of.withYear(2012);
              System.out.println("localDateTime = " + localDateTime); // 2012-08-08T20:08:08
              System.out.println("of = " + of); // 2008-08-08T20:08:08
              LocalDateTime localDateTime1 = localDateTime.withMonth(12);
              System.out.println("localDateTime1 = " + localDateTime1); // 2012 12 8 20 8 8
      
              System.out.println("-------------------------------------------------------");
              // 6.实现特征的增加并打印
              LocalDateTime localDateTime2 = localDateTime1.plusDays(2);
              System.out.println("localDateTime2 = " + localDateTime2); // 2012 12 10 20 8 8
              System.out.println("localDateTime1 = " + localDateTime1); // 2012 12 8 20 8 8
              LocalDateTime localDateTime3 = localDateTime2.plusHours(3);
              System.out.println("localDateTime3 = " + localDateTime3); // 2012 12 10 23 8 8
      
              System.out.println("-------------------------------------------------------");
              // 7.实现特征的减少并打印
              LocalDateTime localDateTime4 = localDateTime3.minusMinutes(1);
              System.out.println("localDateTime4 = " + localDateTime4); // 2012 12 10 23 7 8
              System.out.println("localDateTime3 = " + localDateTime3); // 2012 12 10 23 8 8
              LocalDateTime localDateTime5 = localDateTime4.minusSeconds(3);
              System.out.println("localDateTime5 = " + localDateTime5); // 2012 12 10 23 7 5
      
          }
      }
      
      
  6. Instant类的概述:这个类和之前讲的Date类相似

  7. 基本概念:java.time.Instant类主要用于描述瞬间的时间点信息,一个特定的瞬间

  8. 常用的方法

    方法声明功能介绍
    static Instant now()从系统时钟上获取当前时间
    OffsetDateTime atOffset(ZoneOffset offset)将此瞬间与偏移量组合以创建偏移日期时间
    static Instant ofEpochMilli(long epochMilli)根据参数指定的毫秒数来构造对象,参数为距离1970年1月1 日0时0分0秒的毫秒数
    long toEpochMilli()获取距离1970年1月1日0时0分0秒的毫秒数
    package com.huang.task03;
    
    import java.time.Instant;
    import java.time.OffsetDateTime;
    import java.time.ZoneOffset;
    
    public class InstantTest {
    
        public static void main(String[] args) {
    
            // 1.使用Instant类来获取当前系统时间  并不是当前系统的默认时区  本初子午线   差8小时  东八区
            Instant now = Instant.now();
            System.out.println("获取到的当前时间为:" + now); // 获取到的当前时间为:2022-01-06T07:50:42.997298900Z
    
            // 2.加上时区所差的8个小时
            // 将此瞬间与偏移量组合以创建偏移日期时间 实际上就是把差的8个小时补回来。
            OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
            System.out.println("偏移后的日期时间为:" + offsetDateTime); // 偏移后的日期时间为:2022-01-06T15:50:42.997298900+08:00
    
            System.out.println("--------------------------------------------------------");
            // 3.获取当前调用对象距离标准基准时间(1970-1-1 0:0:0)的毫秒数
            long g1 = now.toEpochMilli();
            System.out.println("获取到的毫秒差为:" + g1); // 获取到的毫秒差为:1641455442997
    
            // 4.根据参数指定的毫秒数来构造对象
            Instant instant = Instant.ofEpochMilli(g1);
            System.out.println("根据参数指定的毫秒数构造出来的对象为:" + instant); // 根据参数指定的毫秒数构造出来的对象为:2022-01-06T07:50:42.997Z
        }
    }
    
    
  9. DateTimeFormatter类的概述:有点像SimpleDateFormatter,区别在于前者安全,后者不安全。且前者是用来对LocalDateTime类做处理的,后者是专门对Date类做处理的。

    1. 基本概念:java.time.format.DateTimeFormatter类主要用于格式化和解析日期

    2. 常用方法:TemporalAccessor 是一个接口,LocalDate、LocalTime、LocalDateTime、Instant都是它的实现类。可以直接用实现类对象作为参数传入即可。

      方法声明功能介绍
      static DateTimeFormatter ofPattern(String pattern)根据参数指定的模式来获取对象
      String format(TemporalAccessor temporal)将参数指定日期时间转换为字符串
      TemporalAccessor parse(CharSequence text)将参数指定字符串转换为日期时间
      package com.huang.task03;
      
      import java.time.LocalDateTime;
      import java.time.format.DateTimeFormatter;
      import java.time.temporal.TemporalAccessor;
      
      public class DateTimeFormatterTest {
      
          public static void main(String[] args) {
      
              // 1.获取当前系统的日期时间并打印
              LocalDateTime now = LocalDateTime.now();
              System.out.println("now = " + now);
      
              // 2.按照指定的格式准备一个DateTimeFormatter类型的对象
              DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
              // 3.实现日期时间向字符串类型的转换并打印
              String str = dateTimeFormatter.format(now);
              System.out.println("调整格式后的结果是:" + str);
              // 4.实现字符串类型到日期时间类型的转换并打印
              TemporalAccessor parse = dateTimeFormatter.parse(str);
              System.out.println("转回去的结果是:" + parse);
          }
      }
      
      

总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值