package com.ydlclass.date;


import java.time.*;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;

public class InstantTest {
    //由于date,calender类中的月份是从0开始的,所以jdk1.8之后主要是使用INstant,localdate,datetimeformatter代替原先
    public static void main(String[] args) {
        Instant now = Instant.now();//标准时间,我们在使用的时候最好不好改变它的值
        ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("GMT+08:00"));//这里的时间加法格式注意清楚,各个时间段是几位的需要注意
        ZonedDateTime zonedDateTime1 = now.atZone(ZoneId.of("GMT-04:00"));//通过国家所在的时区,改变显示时间

        OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.UTC);//atoffset,时区偏移量,可以设置为某个时区为标准界定时区

        OffsetDateTime offsetDateTime1 = now.atOffset(ZoneOffset.MAX);

        Instant instant = now.plusMillis(8 * 24 * 60 * 60 * 1000);

        Instant plus_after = now.plus(Duration.ofDays(365));//建议使用这种方式对当前时间的若干时间和若干天事件之后的具体时间的打印;

        Instant minus = now.minus(Duration.ofMinutes(4));

        Instant plus = now.plus(2, ChronoUnit.DAYS);//这个方法中是一个前面为数量后面为单位的一个情况,我们可以点击这个函数,或者是发现TemporalUnit是一个接口,他存在其他类型,当我们点不动时
        //可以使用Ctrl+h键查看这个接口中包含哪些实现类,可以发现存在一个实际的枚举类型


        System.out.println(plus);
        System.out.println(now.get(ChronoField.NANO_OF_SECOND));//使用这个get方法时注意其传入的是一个接口,那么我们注意到需要使用实现这个接口的类,以及枚举,
        //按住ctrl+鼠标左键点击可以发现这个get函数支持的chronofield支持的字段只有几个字段,其他的字段不是switch case字段中可以提供的选择项目,当没有这个选择项时
        //java会抛出一个异常,这个异常主要就是这个case的可选项目中没有我们输入的枚举,还有一个原因是我们没有在case语句中使用default字段处理那些不存在的输入字段;


        System.out.println(plus_after);//多长时间量之后或者之间的正确的表达方式,不要对世界时间直接的改变

        System.out.println(minus);//世界时间的4分钟之前,我们可以使用plus()函数,或者minus()函数来对一个时间量的加减;
        //这个方法中存在多个重载方法,这个方法传入的参数可以是多种多样的,由于面向对象编程,面向接口编程,所以这个plus函数中使用了一个TemporalAmount接口
        //这个接口中使用了Duaration时间间隔类实现TempoaralAmount方法,这个类中由同样是

        System.out.println(instant);
        //hierarchy:等级制度,subtype子类型;
        //如何区分一个对象的函数执行加减方法之后,是对象本身呢?还是对象加减方法之后是其他对象呢?
        //答:主要看这个对象的方法的返回类型,一般是对象方法的返回值是一个void类型,如果这类的方法返回的的类型不是一个void类型,那么这个对象执行方法之后生成
        //是一个新的对象,并且这个对象的返回值可能是其他类型的对象,所以我们在使用这个新类型的对象时往往不能打印这一类的对象
        //而是对这些对象先创建一个引用,用这个引用指向这个对象完成这个对象的答应

        System.out.println(now.plus(Duration.ofDays(2)));//例如由于now对象的plus函数返回的类型是一个Instant类型所以可以直接打印

        System.out.println(now.atZone(ZoneId.of("GMT+09:00")));


//        System.out.println(now);
//        System.out.println(offsetDateTime);
//        System.out.println(offsetDateTime1);

//        System.out.println(offsetDateTime);
//        System.out.println(offsetDateTime1);
//        System.out.println(zonedDateTime1);


        Instant parse = Instant.parse("2023-03-22T15:35:38.327128Z");//此函数是将一个字符串解析为一个Instant对象,注意这个对象
        //所传入的字符串只能是这种固定格式的方式来传入进去,如果发生空格会产生错误将会抛出这个异常;
        //实现方法主要是依据拼写的方式实现字符串的解析,不能随便的篡改;
        
        
        
        System.out.println(parse);
        
        //这个类的学习可以直接学习到很多学习api文档的方法

    }

}