2022-07-28 第六小组 张宁杰 时间类和String类

Java的值传递和所谓的引用传递

本质上Java只有值传递,所有的赋值传参都是一次值的拷贝
引用数据类型拷贝的就是引用地址,基本数据类型拷贝的是值,不会传入实例对象

public class Ch01 {

    private String name;

    public Ch01(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void change(Ch01 ch01) {
//        ch01 = new Ch01("jerry");
//          ch01.name = "jerry";
        ch01.setName("jerry");
    }

    public static void change(int j) {
        j = 8;
    }

    @Override
    public String toString() {
        return "Ch01{" +
                "name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) {
        Ch01 ch01 = new Ch01("tom");
        change(ch01);
        System.out.println(ch01);
//        int i = 5;
//        change(i);
//        System.out.println(i);
    }
}

常用api(application programming interface)

应用程序接口
JDK跟我们提供的一些已经写好的类,我们可以直接调方法来解决问题
我们类的方法,在宏观上都可以称为接口
api文档:介绍api
时间相关api

public class Ch02 {

    /**
     * 姓名属性
     */
    private String name;

    /**
     * 这是一个显示信息的方法
     */
    public void show() {
        System.out.println("哈哈");
    }

    /**
     * 这是一个无参构造器
     */
    public Ch02(){

    }
}

在/**/里的注释经过Java Doc转换以后会生成一个api文档

对时间进行操作

时间戳:格林尼治时间1970.1.1 00:00:00 到今天2022.7.28 9:29:30的毫秒数
1s=1000ms,1min=60s,1h=60min,1day=24h。
时间戳在全世界都是固定的
获取时间戳
System.out.println(System.currentTimeMillis());
可以通过时间戳转换成我们当前所在地的具体时间和日期

Date类

Date date = new Date();
当返回负数时,说明调用者时间是在参数时间之前
当返回0时,说明调用者时间和参数时间相同
当返回正数时,说明调用者时间在阐述时间之后
System.out.println(date2.after(date1));
System.out.println(date1.compareTo(date2));

Calendar类

Calendar是一个抽象类
初始化:
提供了一组对“年月日时分秒星期”等信息的操作函数。操作不同时区的信息。 JDK1.1版本开始,在处理时间和日期时,系统推荐使用Calendar类。

public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
        System.out.println(calendar.get(Calendar.DATE));
        System.out.println(calendar.get(Calendar.MONTH));
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
        System.out.println(calendar.get(Calendar.HOUR));
        System.out.println(calendar.get(Calendar.MILLISECOND));
    }

获取时区

 public static void main(String[] args) {
        System.out.println(TimeZone.getDefault());
        System.out.println(new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT-08:00"));
        System.out.println(calendar.get(Calendar.HOUR));
    }
 public static void main(String[] args) {
        ZoneId zoneId = ZoneId.of("America/New_York");
        System.out.println(TimeZone.getTimeZone(zoneId));
    }
运行结果:
sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]

日期格式化(SimpleDateFormat)

format:格式化Date类型,把Date类型转成String类型
我们要展示数据到客户端。

public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);
        /*
            yyyy:年
            yy:年的后两位
            MM:月
            dd:日
            HH:小时 24小时制
            hh:小时 12小时制
            mm:分
            ss:秒
            SSS:毫秒


            2022年7月28日 11:23:50.300
         */
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
        String s = sdf.format(date);
        System.out.println(s);
    }

parse:把String类型的时间,转成Date类型
从客户端传过来的时间,一般都是String类型,存入数据库。

设计一个工具类:
可以对Date类型的日期进行格式化,转成String
format方法 参数是Date,返回值是String
可以对String类型的日式进行格式转换,转换成Date
parse方法 参数是String,返回值是Date
思考:
1.这个类要不要留个口
2.方法,要不要用final

public class DateUtils {

    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    public static final String dateToString(Date date){

        return SDF.format(date);
    }

    public static final Date stringToDate(String dateStr) throws ParseException {

        return SDF.parse(dateStr);
    }
}

Date和Calendar,获取到的月份都是0-11,而不是我们生活中的1-12。
阿里巴巴规约明确要求:
如果是jdk8的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat

新的实践类:

Instant
LocalDate
LocalTime
LocalDateTime
DateTimeFormatter

 public static void main(String[] args) {
        Instant instant = Instant.now();
        System.out.println(instant.atZone(ZoneId.systemDefault()));
        // 获取秒数
        System.out.println(instant.getEpochSecond());
        // 获取毫秒数
        System.out.println(instant.toEpochMilli());
        long millis = System.currentTimeMillis();
        System.out.println(Instant.ofEpochMilli(millis));

        System.out.println("---------------------------------------------");
        String text = "2020-07-28T14:06:50.147Z";
        Instant parse = Instant.parse(text);
        System.out.println(parse);

    }
运行结果:
2022-07-28T20:28:10.922512700+08:00[Asia/Shanghai]
1659011290
1659011290922
2022-07-28T12:28:10.984Z
---------------------------------------------
2020-07-28T14:06:50.147Z

输出若干天以后的日期:

public static void main(String[] args) {
        Instant instant = Instant.now();
        Instant plus = instant.plus(Duration.ofDays(5));
        System.out.println(plus);
        //持续时间Duration
    }

LocalDate:获取当前日期

public static void main(String[] args) {
        LocalDate now = LocalDate.now();
        System.out.println(now);
        System.out.println(now.getMonth());
        System.out.println(now.getDayOfWeek());
        System.out.println(now.getDayOfMonth());
        LocalDate of = LocalDate.of(2024, 9, 10);
        System.out.println(of);
        // 判断是否为闰年
        // 能被4整除不被100,被400
        System.out.println(of.isLeapYear());
    }

LocalTime:本地时间

public static void main(String[] args) {
        LocalTime now = LocalTime.now();
        System.out.println(now);

    }

LocalDateTime:获取日期和时间

public static void main(String[] args) {
        System.out.println(LocalDateTime.now());
    }

DateTimeFormatter:处理日期的格式化问题

public static void main(String[] args) {
        LocalDate now = LocalDate.now();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        System.out.println(now.format(dateTimeFormatter));
    }

Instant和Date的转换、Instant和LocalDate转换、Date和LocalDateTime转换

public static void main(String[] args) {
        Instant instant = Instant.now();
        // 把Instant转成Date
        Date date = Date.from(instant);
        // 把Date转成Instant
        Instant toInstant = date.toInstant();
        // 把Instant转成LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        // 把LocalDateTime转成Instant
        Instant instant1 = LocalDateTime.now().toInstant(ZoneOffset.UTC);

        // 把date转成LocalDateTime
        Date date1 = new Date();
        Instant instant2 = date.toInstant();
        LocalDateTime localDateTime1 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault());

        // 把LocalDateTime转成Date
        LocalDateTime now = LocalDateTime.now();
        Instant instant3 = now.atZone(ZoneId.systemDefault()).toInstant();
        Date date2 = Date.from(instant3);


    }

数学类Math

随机数 random() double
向上取整 ceil() double
向下取整 floor() double
四舍五入 round() long

 public static void main(String[] args) {
        // 生成0-1的随机数
        // 生成1-100的随机整数
        // 生成13-26的随机整数
        // (int)(Math.random()*(max-min)+min)
        System.out.println(Math.random());
        System.out.println((int)(Math.random() * (26 - 13) + 13));
    }

BigDecimal的构造器

使用BigDecimal的构造器,开发中,传入的参数必须是字符串

 public static void main(String[] args) {
        double d1 = 0.7;
        double d2 = 0.1;
        BigDecimal bigDecimal1 = new BigDecimal(d1);
        BigDecimal bigDecimal2 = new BigDecimal(d2);
        BigDecimal bigDecimal3 = new BigDecimal("0.7");
        BigDecimal bigDecimal4 = new BigDecimal("0.1");

        System.out.println(bigDecimal3.add(bigDecimal4));
    }

Arrays数组的工具类

 public static void main(String[] args) {
        int [] arr = new int[]{1,2,3,4,5};
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr);
        System.out.println(Arrays.binarySearch(arr, 4));
        int[] ints = Arrays.copyOf(arr, 2);
        System.out.println(Arrays.toString(ints));
        System.out.println(Arrays.equals(arr, ints));
    }

System类

public static void main(String[] args) {
//        System.exit(-1);
//        System.out.println();
//        System.err.println("错误信息");
//        System.currentTimeMillis();
        Properties properties = System.getProperties();
        System.out.println(properties);
    }

Objects

 public static void main(String[] args) {
        System.out.println(Objects.isNull(""));
    }

StringBuffer和StringBuilder

可变的字符序列,和String是有本质区别的
StringBuffer是同步的。安全,效率低
StringBuilder是异步的。不安全。效率高

public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("你好");
//        System.out.println(stringBuffer);
        stringBuffer.append(",我好").append(",大家好");
//        System.out.println(stringBuffer);

//        stringBuffer.delete(4,7);
//        stringBuffer.deleteCharAt(0);
//        stringBuffer.insert(1,"哈哈");
        stringBuffer.reverse();
        System.out.println(stringBuffer);
//        String str = "hello";
//        String s = str.concat(",world!!");
//        System.out.println("str = " + str);
//        System.out.println("s = " + s);
    }
posted @ 2022-07-28 22:23  贵妃就是贵妃  阅读(13)  评论(0编辑  收藏  举报