485-492System类/BigInteger&BigDecimal/有关时间的类

一、System

package com.day5_21;

import java.util.Arrays;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class SystemClass12 {
    public static void main(String[] args) {
        // 1、exit退出当前程序,exit(0)中0表示当前的一个状态
//        System.out.println("ok1");
//        System.exit(0);  // 0表示程序退出的状态,0是一个状态值,0表示正常状态
//        System.out.println("ok2");

        // 2、arraycopy
        /*
         * @param      src      the source array.
         * 源数组
         * @param      srcPos   starting position in the source array.
         * 从源数组的哪一个索引进行拷贝
         * @param      dest     the destination array.
         * 将源数组的数据拷贝到哪个数组
         * @param      destPos  starting position in the destination data.
         * 将数据拷贝到目标数组的哪一个位置
         * @param      length   the number of array elements to be copied.
         * 从源数组中拷贝多少个数据到目标数据中
         * 看看这五个参数的含义
         */
        int[] src = {1,2,3};
        int[] dest = new int[3];
        System.arraycopy(src, 0, dest, 0, 3);  // 如果拷贝数量超过了源数组就会出现异常
        System.out.println("dest="+ Arrays.toString(dest));  // [1, 2, 3]

        // 3、currentTimeMillis:返回当前时间距离1970-1-1的毫秒数
        System.out.println(System.currentTimeMillis());  // 1747824782884
    }
}

/*
    System类常见方法和案例
    1、exit可以退出当前程序
    2、arraycopy可以复制数组元素,比较适合底层调用,一般使用Array.copyOf完成复制数组
    int[] src = {1,2,3};
    int[] dest = new int[3];
    System.arraycopy(src,0,dest,0,3);
    3、currentTimeMillens:返回当前时间距离1970-1-1的毫秒数
    4、gc:运行垃圾回收机制System.gc();
 */

二、BigInteger和BigDecimal

package com.day5_21;

import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class BigIntegerAndBigDecimalClass13 {
    public static void main(String[] args) {
//        long l = 2378888888899999999999999999999l;
//        // 这个数太大了,直接会报错Error
        // 当我们编程中需要处理很大的整数,long就不够使用,现在可以使用一个叫做
        // BigInteger的类来搞定
        BigInteger bigInteger = new BigInteger("2378888888899999999999999999999");
        // 如果直接是输入数字进去,这样仍然会非常大,我们需要传入一个字符串进去。底层来进行一个转换。
        System.out.println(bigInteger);
        // 但是如果我们要对这个数据进行加减乘除怎么办呢?注意,这里不能直接进行加减乘除
//        System.out.println(bigInteger + 1);  // 这里会出现Error
        // 如果想要加需要使用对应的方法add()
        BigInteger bigInteger1 = new BigInteger("100");
        BigInteger add = bigInteger.add(bigInteger1);
        System.out.println(add);
        //其他的运算同理 减法subtract 乘法multiply 除法divide,多大的数计算都可以



        // 浮点数同理
        BigDecimal bigDecimal = new BigDecimal("1999.11111111999999999999999777777788");
        System.out.println(bigDecimal);
        // 同理也不能进行直接加减乘除了,需要使用对应的方法
        // 需要创建一个对应的BigDecimal,然后调用响应的方法
        // 也是一样的方法名字,但是除法需要注意,进行除法的时候有可能除不尽
        // 可能是一个无限循环小数这样会抛出异常。这个怎么解决呢!?
        // 只需要在方法后面指定一个精度即可。也就是在divide再添加一个参数
        // 以后遇到无限循环小数可以保留一个分子的精度
        // BigDecimal.ROUND_CEILING
    }
}

/*
    BigInteger和BigDecimal类
    BigInteger和BigDecimal介绍
    应用场景:
    1、BigInteger适合保存比较大的整数
    2、BigDecimal适合保存精度更高的浮点数(小数)

 */

三、有关时间的类

package com.day5_21;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class DateClass14 {
    public static void main(String[] args) {

    }
}
/*
    日期类,关于日期类知道怎么查,并且知道怎么使用即可,不用每个方法都记
    第一代日期类
    1、Date:精确到毫秒,代表特定的瞬间
    2、SimpleDateFormat:格式和解析日期的类
       SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化
       (日期->文本)、解析(文本->日期)和规范化。
    tip:在类图当中,属性指的是set和get方法
 */
package com.day5_21;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class DateClass15 {
    public static void main(String[] args) throws ParseException {
        // 1、通过无参构造器可以获得当前的系统时间
        Date d1 = new Date();  // 获取当前的系统时间
        System.out.println("当前的日期 = " + d1); // Wed May 21 19:44:50 CST 2025
        // tip在java.util中也有一个Date,在java.sql中也有一个Date
        // sql这个是和数据库相关的,不要引入这个包
        // 默认输出的格式不是我们中国人的格式,我们需要对这个时间格式进行一个时间格式的转换。

        // 2、时间格式的转换
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
        String format = sdf.format(d1);  // format将日期转换成指定格式的字符串
        System.out.println(format);
        // 关于这里的时间格式的yyyy,MM,dd,hh,mm,ss E这些不是随便乱写的。
        // 这里的时间格式的字母是规定好了的,我们可以打开手册进行查看。
        // 另外关于这个Date()还有一个使用的方式就是可以填写一个毫秒数Date(long)
        // 可以指定毫秒数,获取时间

        // 3、根据毫秒数计算时间
        Date d2 = new Date(9234567);
        System.out.println(d2);  // Thu Jan 01 10:33:54 CST 1970

        // 4、可以将一个格式化的字符串转换成对应的Date
        String s = "2025年05月21日 07:51:48 星期三";
        Date parse = sdf.parse(s);  // 这里需要手动抛出一个异常
        System.out.println("parse=" + parse);  // parse=Wed May 21 07:51:48 CST 2025
        System.out.println("parse=" + sdf.format(parse));  // 2025年05月21日 07:51:48 星期三
        // 在将String转换成Date的时候,使用sdf格式需要和你给定的String的格式是一样的,否则会抛出转换异常
    }
}

package com.day5_21;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class DateClass16 {

}

/*
    日期类
    第二代日期类型
    1、第二代日期类型主要就是Calendar类,日历
    2、Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、
    DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并且为了操作日历字段(例如获取下个星期的日历)提供了方法
    来看一下这个类的结构
    这个类同样实现了三个接口:Comparable Serializable Cloneable ,继承Object
    看看有哪些方法和属性,内部类等。
    首先:
    1、是一个抽象类,我们如何获取一个实例呢!?
    2、构造器是一个私有的,我们可以通过getInstance()来获取实例
    3、并且提供大量的方法和字段提供给程序员

 */
package com.day5_21;

import java.util.Calendar;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class DateClass17 {
    public static void main(String[] args) {
        // 1、获取一个Calendar这个实例,我们不能通过new的方式,需要通过getInstance()方法
        Calendar c = Calendar.getInstance();  // 创建日历类对象//比较简单,自由
        System.out.println("c=" + c);
        /*
        c=java.util.GregorianCalendar[time=1747834663695,
        areFieldsSet=true,areAllFieldsSet=true,lenient=true,
        zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
        offset=28800000,dstSavings=0,useDaylight=false,
        transitions=19,lastRule=null],firstDayOfWeek=1,
        minimalDaysInFirstWeek=1,ERA=1,YEAR=2025,MONTH=4,
        WEEK_OF_YEAR=21,WEEK_OF_MONTH=4,DAY_OF_MONTH=21,
        DAY_OF_YEAR=141,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,
        AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=37,SECOND=43,
        MILLISECOND=695,ZONE_OFFSET=28800000,DST_OFFSET=0]
        这些都是它的字段,我们可以通过这些字段得到对应的值。
         */
        // 2、获取日历对象的某个日历字段
        System.out.println("年:" + c.get(Calendar.YEAR));
        System.out.println("月:" + (c.get(Calendar.MONTH) + 1));  // 默认从零开始,所以这里要加一
        System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
        System.out.println("时:" + c.get(Calendar.HOUR));
        System.out.println("分:" + c.get(Calendar.MINUTE));
        System.out.println("秒:" + c.get(Calendar.SECOND));
        // 这里的Calender没有专门的格式化方法,所以需要程序员自己来组合显示
    }
}

// 日期类型的应用实例
package com.day5_21;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Calendar;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class DateClass18 {
    public static void main(String[] args) {
        // tip
        Calendar c = Calendar.getInstance();
        System.out.println(c.get(Calendar.HOUR));  // 这个输出的是十进制的9
        System.out.println(c.get(Calendar.HOUR_OF_DAY));  // 这里输出的是二十四进制的21
        // 1、我们可以使用now放回表示当前日期时间的对象
        LocalDateTime ldt = LocalDateTime.now();  // 2025-05-21T21:57:08.753
        // 或者是LocalDate.now();  LocalTime.now()
        System.out.println(ldt);
        System.out.println("年="+ldt.getYear());
        System.out.println("月="+ldt.getMonth());
        System.out.println("月="+ldt.getMonthValue());
        System.out.println("日="+ldt.getDayOfMonth());
        System.out.println("时="+ldt.getHour());
        System.out.println("分="+ldt.getMinute());
        System.out.println("秒="+ldt.getSecond());

        // 2、LocalDate,LocalTime
        LocalDate now = LocalDate.now();  // 可以获取年月日
        LocalTime now2 = LocalTime.now();  // 获取到时分秒
    }
}

/*
    日期类
    第三代日期类
    前面两代日期类的不足分析
    JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了,而Calendar也存在的问题:
    1、可变性:像日期和时间这样的类型应该是不能改变的。
    2、偏移性:Date中的年份是从1900开始的,而月份都是从零开始
    3、格式化:格式化之对Date有用,Calendar则不行
    4、此外,它们也不是线程安全的;不能处理润秒等(每隔两天,多出1s)。

    第三代日期类的常见方法
    LocalDate日期,LocalTime时间、LocalDateTime日期时间,JDK8加入
    LocalDate只包含日期,可以获取日期字段
    LocalTime只包含时间,可以获取时间字段
    LocalDateTime包含日期+时间,可以获取日期和时间字段
    第三代日期的类图比较复杂,实现了非常多的接口
    说明该类的能力强大
    再看看构造器,方法等。
 */
package com.day5_21;

import java.util.Date;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author alice_huijing
 * @version 1.0
 */
public class DateClass19 {
    public static void main(String[] args) {
        // 1、使用DateTimeFormatter对象来进行格式化
        // 创建DateTimeFormatter对象
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH小时mm分钟ss秒");
        LocalDateTime ldt = LocalDateTime.now();
        String format = dateTimeFormatter.format(ldt);
        System.out.println("格式化的时间:" + format);

        // 2、通过静态方法now()获取当前时间戳的对象
        Instant now = Instant.now();
        System.out.println(now);  // 2025-05-21T14:13:18.832Z
        // 3、通过from可以将Instant转为Date
        Date date = Date.from(now);
        System.out.println(date);
        // 4、通过date的toInstant()可以将date转换成Instant对象
        Instant instant = date.toInstant();
        System.out.println(instant);

        // 5、提供plus和minus方法可以对当前时间进行加或者减
        // 看看890天之后,是什么时候,把年月日-时分秒
        LocalDateTime localDateTime = ldt.plusDays(890);
        System.out.println(dateTimeFormatter.format(localDateTime));  // 890天之后
        // 6、3456分钟之前是什么时候,将年月日-时分秒输出
        LocalDateTime localDateTime1 = ldt.minusMinutes(3456);
        System.out.println(dateTimeFormatter.format(localDateTime1));
    }
}

/*
    日期类
    DateTimeFormatter格式日期类
    类似于SimpleDateFormat

    Instant时间戳
    类似于Date
    提供了一系列的Date类转换的方式
    查看类图也是实现了一堆接口

    第三代日期类还有更多的方法
    LocalDateTime类
    MonthDay类,检查重复时间
    是否为闰年
    增加日期的某个部分
    使用plus方法检测增加时间的某个部分
    使用minus方法测试查看一年前和一年后的日期

 */
posted @ 2025-05-21 22:31  请叫我虾  阅读(38)  评论(0)    收藏  举报