常用时间相关的API

一、时间相关的知识点

1.1、格林威治标准时间

        格林威治标准时间(GMT, Greenwich Mean Time)起源于英国格林威治天文台,基于地球自转计算的时间,经度位于本初子午线(0度经线),它认为地球每日自转24小时,所以划分了24个时区,其中东、西各12个时区,北京位于东八区,所以在格林威治标准时间的基础上加8小时就是北京时间。

1.2、 UTC时间

        随着时代的发展,人们发现地球自转速度并不完全稳定,所以格林威治标准时间并不准确,就引入了UTC时间,是以铯原子的震动频率计算出来的

 

 1.3、秒、毫秒、微妙之间的关系

1秒=1000毫秒

1毫秒=1000微秒

1微秒=1000纳秒

所以1年=365×24×60×60×1000毫秒

1年有365天,1天有24小时,1小时有60分钟,1分钟有60秒,1秒钟有1000毫秒

  

1.4、总结

 

二、Date对象的使用

使用Date对象的时候,一定要记得导入的包是 import java.util.Date;

 2.1、Date的无参构造方法

//使用date的无参构造,表示系统当前时间
    @Test
    public void test1() {
        Date date1 = new Date();
        System.out.println("date1 = " + date1);
    }

表示的系统的当前时间

2.2、Date的有参构造 

//Date的标准时间是1970年1月1日00:00:00
    //这里会显示1970年1月1日08:00:00,是因为中国有8小时时区
    @Test
    public void test2() {
        Date date1 = new Date(0L);
        System.out.println("date1 = " + date1);
    }

Date的有参构造是在标准时间的基础上加上毫秒值,Date的标准时间是1970年1月1日00:00:00

//使用Date的有参构造,是在1970年1月1日00:00:00的基础上加上指定的毫秒值
    //下面是在1970年1月1日00:00:00基础上加1年
    @Test
    public void test3() {
        Date date2 = new Date(365 * 24 * 60 * 60 * 1000L);
        System.out.println("date2 = " + date2);

    }

        在标准时间的基础上加上1年表示1971年1月1日00:00:00,这里会显示1971年1月1日08:00:00,是因为中国有8小时时区

2.3、Date的set方法和get方法

//使用Date的set方法,也是在1970年1月1日00:00:00的基础上加上指定的毫秒值
    //下面是在1970年1月1日00:00:00基础上加1年,和test2中的效果一样
    @Test
    public void test4() {
        Date date3 = new Date();
        long time = date3.getTime();
        System.out.println("time = " + time);
        date3.setTime(365 * 24 * 60 * 60 * 1000L);
        System.out.println("date3 = " + date3);
        long time1 = date3.getTime();
        System.out.println("time1 = " + time1);

    }

         使用Date的set方法,也是在1970年1月1日00:00:00的基础上加上指定的毫秒值,下面是在1970年1月1日00:00:00基础上加1年,和test2中的效果一样,get方法则是获取当前时间与1970年1月1日00:00:00时间之间的毫秒值之差

2.4、Date的after和before方法

//使用date对象时,可以使用before和after两种方法比较日期的先后
    @Test
    public void test5() {
        Date date4 = new Date(0L);
        Date date5 = new Date(1000L);
        System.out.println("date5 = " + date5);
        if (date5.after(date4)) {
            System.out.println("date5的时间比date4要大");

        }
    }

三、SimpleDateFormat的使用

3.1、format方法将日期转化为字符串

//使用SimpleDateFormat的format将date对象转化为字符串
    @Test
    public void test7() {
        Date date = new Date();
        System.out.println("date = " + date);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:dd:ss");
        String dateFormat = sdf.format(date);
        System.out.println("dateFormat = " + dateFormat);
    }

3.2、parse方法将字符串转化成日期

//使用SimpleDateFormat的parse将字符串转化为date日期
    @Test
    public void test8() throws ParseException {
        String str="2023-11-11 11:11:11";
        //这里的格式要和上面的字符串日期格式一模一样,不然会报错
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:dd:ss");
        Date date = sdf.parse(str);
        System.out.println("date = " + date);
    }

 

 四、Calendar类的使用

Calendar是一个日历类,可以在Calendar类中对年、月、日进行操作。 

4.1、Calendar类中的get方法和getInstance方法

//Calendar是一个日期类,可以在Calendar类中对年、月、日进行操作
    //Calendar是个抽象类,不能直接new,要使用它的静态方法getInstance得到它的子类对象
    //Calendar类中的Time表示当前设置时间的毫秒值,我们这里setTime表示将设置的时间的日期赋值给Calendar
    //这里就是将1970年1月1日 00:00:00赋值给Calendar
    //这里有一个细节:month会比当前月份少1个月,也就是说得到的month如果是0,表示1月份,得到的是1表示2月份
    @Test
    public void test1() {
        Calendar c = Calendar.getInstance();
        Date date=new Date(0L);
        c.setTime(date);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int dayOfWeek = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(year+" "+month+" "+dayOfWeek);
        System.out.println("c = " + c);

    }

 Calendar是个抽象类,不能直接new,要使用它的静态方法getInstance得到它的子类对象,Calendar类中的Time表示当前设置时间的毫秒值,我们这里setTime表示将设置的时间的日期赋值给Calendar。

这里就是将1970年1月1日 00:00:00赋值给Calendar,这里有一个细节:month会比当前月份少1个月,也就是说得到的month如果是0,表示1月份,得到的是1表示2月份

得到最终的结果

 

4.2、 Calendar类中的set方法

        将1970年1月1日 00:00:00赋值给Calendar,并将月份设置为3月,因为month会比当前月份少1个月,也就是说得到的month如果是0,表示1月份,得到的是1表示2月份

//将1970年1月1日 00:00:00赋值给Calendar
    //并将月份设置为3月,因为month会比当前月份少1个月,也就是说得到的month如果是0,表示1月份,得到的是1表示2月份
    @Test
    public void test2() {
        Calendar c = Calendar.getInstance();
        Date date=new Date(0L);
        c.setTime(date);
        c.set(Calendar.MONTH,2);
        System.out.println(c);

    }

 4.3、 Calendar类中的add方法

将1970年1月1日 00:00:00赋值给Calendar,并将当前月份加1个月。

//将1970年1月1日 00:00:00赋值给Calendar
    //并将当前月份加1个月
    @Test
    public void test3() {
        Calendar c = Calendar.getInstance();
        Date date=new Date(0L);
        c.setTime(date);
        c.add(Calendar.MONTH,1);
        System.out.println("c = " + c);

    }

 

五、ZoneId用来获取时区

5.1、获取所有时区 

//获取所有时区名称
    @Test
    public void test1() {
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();
        System.out.println("zoneIds. = " + zoneIds.size());
        System.out.println("zoneIds = " + zoneIds);

    }

5.2、获取系统默认时区 

//获取系统默认时区
    @Test
    public void test2() {
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println("zoneId = " + zoneId);
    }

 5.3、获取指定的时区 

 

 //获取指定的时区
    @Test
    public void test3() {
        ZoneId zoneId = ZoneId.of("Europe/London");
        System.out.println("zoneId = " + zoneId);
    }

六、Instant的使用 

Instant是jdk8新增的时间类,和Date的使用很多地方都是一样的

6.1、获取当前时间

//获取系统的当前时间,和Date date=new Date()效果一样
    //这个时间是标准时间,所以在这个时间的基础上加8小时才是中国的时间
    @Test
    public void test1() {
        //这个方法和Date date=new Date()效果一样,
        //都是表示当前时间,只是Instant.now();表示的是标准时间,要表示中国的时间还要加8小时
        Instant now = Instant.now();
        System.out.println("now = " + now);
        Date date=new Date();
        System.out.println("date = " + date);
    }

        Instant.now()Date date=new Date()效果一样,都是表示当前时间,只是Instant.now();表示的是标准时间,要表示中国的时间还要加8小时

 6.2、获取指定日期的时间

@Test
    public void test2() {
        //这个方法和Date date=new Date(Long time)效果一样,都是在标准时间的基础上加上指定的秒或毫秒值
        //下面的方法是在标准时间的基础上加1秒钟,标准时间是1970年1月1日 00:00:00
        Instant instant2 = Instant.ofEpochSecond(1L);
        System.out.println("instant2 = " + instant2);
        Date date = new Date(1000L);
        System.out.println("date = " + date);
    }

 这个方法和Date date=new Date(Long time)效果一样,都是在标准时间的基础上加上指定的秒或毫秒值

6.3、获取指定时区的时间

//获取指定时区的时间
    @Test
    public void test3() {
        ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Europe/London"));
        System.out.println("zonedDateTime = " + zonedDateTime);
    }

 6.4、判断日期的先后

//isAfter、isBefore判断时间的先后
    //和Date对象的after和before是一样的效果
    @Test
    public void test4() {
        Instant instant1 = Instant.ofEpochSecond(1L);
        Instant instant2 = Instant.ofEpochSecond(2L);
        boolean result1 = instant1.isAfter(instant2);
        boolean result2 = instant1.isBefore(instant2);
        System.out.println("result1 = " + result1);
        System.out.println("result2 = " + result2);
    }

isAfter、isBefore判断时间的先后,和Date对象的after和before是一样的效果

 6.5、加上或减去指定的时间

//instant1.minusSeconds减去指定的秒钟
    //plusSeconds()加上指定的秒钟
    @Test
    public void test5() {
        Instant instant1 = Instant.ofEpochSecond(3L);
        System.out.println("instant1 = " + instant1);
        Instant instant2 = instant1.minusSeconds(1L);
        System.out.println("instant2 = " + instant2);
    }

instant1.minusSeconds减去指定的秒钟、plusSeconds()加上指定的秒钟

需要注意的是Instant是不带有时区的时间类,所以不能使用DateTimeFormatter进行格式化,DateTimeFormatter格式化的时间对象必须是带有时区的,这个在后面会介绍。

七、 LocalDateTime的使用

        LocalDateTime可以表示时间的年、月、日、时、分、秒

        LocalDate只能表示年、月、日

        LocalTime只能表示时、分、秒

        LocalDateTime、ZonedDateTime、Instant获取当前时间都是now、指定某一个时间都是用of开头、修改时间都是with、增加时间都是plus、减少时间都是minus

7.1、LocalDateTime的使用

@Test
    public void test1() {
        //LocalDateTime可以指定日、月、年、时、分、秒
        LocalDateTime now = LocalDateTime.now();
        System.out.println("now = " + now);
        //LocalDate只能指定年、月、日
        LocalDate localDate = LocalDate.of(2000, 11, 17);
        //LocalDate只能指定时、分
        LocalTime localTime = LocalTime.of(12, 25);
        LocalDateTime time = LocalDateTime.of(localDate, localTime);
        System.out.println("time = " + time);
        long year = ChronoUnit.YEARS.between(time, now);
        long month = ChronoUnit.MONTHS.between(time, now);
        long day = ChronoUnit.DAYS.between(time, now);
        System.out.println("between = " + year);
        System.out.println("month = " + month);
        System.out.println("day = " + day);

    }

 

7.2、instant抓换成  LocalDateTime并且使用DateTimeFormatter格式化

 Instant是不带有时区的时间类,所以不能使用DateTimeFormatter进行格式化,DateTimeFormatter格式化的时间对象必须是带有时区的,所以可以将instant转化为LocalDateTime之后再使用DateTimeFormatter进行格式化

@Test
    public void test6() {
        Instant now = Instant.now();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(now, zoneId);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = dateTimeFormatter.format(localDateTime);
        System.out.println("format = " + format);

    }

八、日期工具类ChronoUnit的使用

  

可以使用ChronoUnit 时间工具类计算两个时间的年、月、日、时、分、秒之间的差距,7.1中已经有使用

 

九、总结

9.1、Date、Calendar、SimpleDateFormat都是jdk7里的时间类

9.2、ZoneId、instant、LocaldateTime都是jdk8才新增的时间类

9.3、instant和Date的使用很多相似、LocaldateTime和Calendar的使用很多相似

9.4、LocalDateTime、ZonedDateTime、Instant获取当前时间都是now、指定某一个时间都是用of开头、修改时间都是with、增加时间都是plus、减少时间都是minus,所以不要刻意去背方法,按照规律去写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值