zoukankan      html  css  js  c++  java
  • Java 各种时间日期相关的操作

    目录

      1、获取当前时间的时间戳

        1.1、时间进制

        1.2、获取毫秒级时间戳

        1.3、获取纳秒级时间戳

      2、java.util包

        2.1、Data

        2.2、Calendar

      3、java.time包

        3.1、LocalDate

        3.2、LocalTime

        3.3、LocalDateTime

        3.4、Clock

        3.5、Instant

      4、日期时间格式

        4.1、简单示例

        4.2、常用格式转换

      5、月份对应的英文

    前言

      平常会遇到很多的日期格式,各种各样的,什么UTC、GMT、毫秒级、微秒级、纳秒级....这些格式,怎么创建这些格式很简单,但是,怎么将这几种格式进行相互转换,是一个问题!!!!所以我专门写一篇博客,做一下笔记吧,反正经常会用到。

      

    1、获取当前时间的时间戳

      1.1、时间进制

      1秒=1000毫秒

      1秒=1000000微秒(1毫秒=1000微秒)

      1秒=1000000000纳秒(1微秒=1000纳秒) ( 1毫秒=1000000纳秒)

      

      要获得秒级时间戳,可以使用毫秒级时间戳除以1000即可。

      1.2、获取毫秒时间戳

      获取毫秒时间戳的方式比较多,一般都是用System.currentTimeMillis()。

    @Test
    public void testTimeStamp() {
    
        // 获得当前时间的时间戳(13位),单位是毫秒
        // 方式1
        long timeStamp1 = System.currentTimeMillis();
    
        // 方式2
        Date date = new Date();
        long timeStamp2 = date.getTime();
    
        // 方式3
        Calendar calendar = Calendar.getInstance();
        long timeStamp3 = calendar.getTimeInMillis();
    
        // 方法4
        Clock clock = Clock.systemUTC();
        long timeStamp4 = clock.millis();
    
        // 打印时间戳示例
        String str = String.format("%s %s %s %s", timeStamp1, timeStamp2, timeStamp3, timeStamp4);
        System.out.println(str);
        // 1567942696718 1567942696718 1567942696728 1567942696731
    }
    

      

      1.3、获取纳秒时间戳

      纳秒时间戳,好像用的不是特别多

    System.out.println(System.nanoTime());
    

        

    2、java.util包

      2.1、Date

      之所以使用java.util.Date指明Date类的包为java.util,是因为java.sql包中也有一个Date类。

      Date类的输出格式:Sun Sep 08 17:49:50 CST 2019

      Date类有很多方法都被废弃了,包括构造方法,所以常用的使用方法如下:

    @Test
    public void testDete() {
        // 利用当前时间戳创建的Date实例,底层调用System.currentTimeMillis()
        Date date1 = new Date();
        System.out.println(date1); // Sun Sep 08 17:49:50 CST 2019
    
        // 利用一个时间戳来创建Date对象(时间戳转Date对象)
        long timeStamp = System.currentTimeMillis() - 100; // 当前时间的100秒前
        Date date2 = new Date(timeStamp);
    
        // Date的compareTo,用于比较两个时间的先后
        int flag = date1.compareTo(date2);
        // date1.compareTo(date2)返回值分三种情况
        // flag = 0, 两个时间相同(时间戳相同)
        // flag = 1, date1 要晚于 date2(date1的时间戳大于date2的时间戳)
        // flag = -1,date1 要早于 date2(date1的时间戳小于于date2的时间戳)
    
        // 判断date1是否晚于date2
        boolean after = date1.after(date2);
    
        // 判断date1是否早于date2
        boolean before = date1.before(date2);
    
        // 获取date对象的时间戳(13位),毫秒
        timeStamp = date1.getTime();
    
        // 设置date对象的时间戳
        date1.setTime(timeStamp);
    }

      建议不要使用Date类的废弃的API,有一个Date.getMonth()获取月份,是从0开始计数,也就是说,5月份,getMonth()的值是4。

      3.2、Calendar

      Calendar是一个抽象类,所以不能实例化,但是可以调用getInstance()静态方法获得Calendar实例。

    @Test
    public void testCalender() {
        // 调用静态方法获取Calendar实例(使用默认的TimeZone和Locale)
        Calendar calendar1 = Calendar.getInstance();
    
        // 获取时间戳(13位),毫秒
        long timeStamp = calendar1.getTimeInMillis();
    
        // 获取Date对象
        Date date1 = calendar1.getTime();
    
        // 设置时间
        Date date2 = new Date(System.currentTimeMillis() - 100);
        calendar1.setTime(date2);
    
        // 获取Calendar的字段值(比如YEAR、MONTH....)
        final int month = calendar1.get(Calendar.MONTH);
        System.out.println(month);  // 注意,month从0开始计算,9月返回8
    
        // 修改时间(为指定字段进行计算)
        calendar1.add(Calendar.YEAR, -1);   // 当前是2019年,这里将年份减1
        System.out.println(calendar1.get(Calendar.YEAR)); // 2018
        // 其他字段,比如月、天、时分秒的计算都是一样的做法
    
        // 获取某个字段的最大值(同样可以有对应的接口获取最小值)
        int maxDay = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(maxDay);  // 2018年9月,最多有30天
    
        Calendar calendar2 = Calendar.getInstance();
    
        // 设置指定字段值,注意,月份是从0开始计数
        calendar2.set(Calendar.YEAR, 2030);
    
        // 设置年月日
        calendar2.set(2029, 11, 5);
        System.out.println(calendar2.getTime());
        // Wed Dec 05 18:06:30 CST 2029
    
        // 设置年月日时分秒
        calendar2.set(2030,10, 4, 12, 58, 59);
    }
    

      

    3、java.time包的类

      3.1、LocalDate

      LocalDate可以说使用的比较多了,因为可以比较方便的获取、设置、修改日期,需要注意的是,LocalDate,从名称上就能看出,这是获取“本地”日期。

    @Test
    public void testLocalDate() {
        // 创建LocalDate对象
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);  // 2019-09-08
    
        final LocalDate localDate2 = localDate.minusDays(5);
        System.out.println(localDate);  // 2019-09-08  注意,并不会直接修改LocalDate对象
        System.out.println(localDate2); //2019-09-03
    
        // getXxxx获取年月日信息
        final int dayOfMonth = localDate.getDayOfMonth();
        System.out.println(dayOfMonth);
    
        // 设置时间为2019-11-20,月份从1开始
        LocalDate localDate3 = LocalDate.of(2019, 11, 20);
        System.out.println(localDate3); // 2019-11-20
    
        // 2019年的第100天
        LocalDate localDate4 = LocalDate.ofYearDay(2019, 100);
        System.out.println(localDate4); // 2019-04-10
        
        // 可以调用LocalData的minusXxx、plusXxx进行日期的计算,getXxx获取某项值
    }
    

      

      3.2、LocalTime

      LocalTime,主要是对Time,也就是对时间的操作,并且是本地的时间

    @Test
    public void testLocalTime() {
        // 利用当前时间,创建LocalTime对象
        LocalTime localTime1 = LocalTime.now();
        System.out.println(localTime1);  // 18:59:31.848
    
        // 指定时-分,创建LocalTime对象,注意,小时范围为0-23
        LocalTime localTime2 = LocalTime.of(23, 59);
        System.out.println(localTime2); // 23:59  注意,输出没有秒数
    
        // 指定时-分-秒,创建LocalTime对象
        LocalTime localTime3 = LocalTime.of(12, 35, 40);
        System.out.println(localTime3); // 12:35:40
    
        // 额外指定纳秒
        LocalTime localTime4 = LocalTime.of(13, 20, 55, 1000);
        System.out.println(localTime4);
    
        // 指定一天中的第1000秒来创建LocalTime对象
        LocalTime localTime5 = LocalTime.ofSecondOfDay(1000);
        System.out.println(localTime5); // 00:16:40
    
        // 利用一天中的纳秒数来创建LocalTime对象
        LocalTime localTime6 = LocalTime.ofNanoOfDay(100000000);
        System.out.println(localTime6); // 00:00:00.100
    
        // 可以调用LocalTime的plusXxx,minusXxx进行时间计算,getXxx获取某项值
    }
    

      

      3.3、LocalDateTime

      聪明的你,一定知道LocalDateTime其实就是LocalDate和LocalTime加在一起的类了,使用方式也是一样的。

    @Test
    public void testLocalDateTime() {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);    // 2019-09-08T19:16:03.884
    
        // 利用LocalDate和LocalTime创建LocalDateTime实例
        LocalDateTime localDateTime1 = LocalDateTime.of(LocalDate.now(), LocalTime.now());
        System.out.println(localDateTime1); // 2019-09-08T19:18:36.934
    
        // of用法和LocalDate和LocalTime的of用法一样,综合在一起了而已
        LocalDateTime localDateTime2 = LocalDateTime.of(2019, 5, 30, 12, 50, 45);
        System.out.println(localDateTime2); // 2019-05-30T12:50:45
    
        // 可以调用LocalDateTime的minusXxx,plusXxx来进行日期和时间的操作,使用getXxx获取某个项的值
    }
    

      

      3.4、Clock

      Clock,时钟,用法如下:

    @Test
    public void testClock() {
        Clock clock = Clock.systemUTC();
    
        // 获取时区
        final ZoneId zone = clock.getZone();
        System.out.println(zone);       // Z
    
        // 获取时间戳(13位),毫秒
        long timeStamp = clock.millis();
        System.out.println(timeStamp);  // 1567942442222
    }
    

      

      3.5、Instant

      Instant基本没用过(对于我而言)

    @Test
    public void testInstant() {
        Instant instant = Instant.now();
        System.out.println(instant);    // 2019-09-08T11:39:29.194Z
    
        final Instant parse = Instant.parse("2019-09-08T11:39:29.109000000Z");
        System.out.println(parse);      // 2019-09-08T11:39:29.109Z
        
        // 可以调用plusXxx,minusXxx进行时间计算
    }
    

      

     4、日期时间格式

      日期时间格式,可以使用SimpleDateFormat类进行自定义设置;

      4.1、简单示例

    @Test
    public void testSimpleDateFormat() {
        Date date = new Date();
        System.out.println(date);       // Sun Sep 08 19:49:57 CST 2019
    
        // 创建想要显示的格式
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        final String dateStr = formatter.format(date);
        System.out.println(dateStr);    // 2019-09-08 19:49:57
    }
    

      

      4.1、常用格式转换

      格式有很多种,业务不同,时间的格式也是不同的,但是可以掌握一下规律

    /**
     * 将UTC时间进行转换
     * 比如  2019-09-08T19:49:57Z
     *      2019-09-08T19:49:57.100Z
     *      2019-09-08T19:49:57.100000000Z
     *      2019-09-08T19:49:57.100000000 CST
     * 转换为
     *      2019-09-08 19:49:57
     */
    @Test
    public void parse1() {
    
        // 要解析的时间字符串
        String src = "2019-09-08T19:49:57.100000000Z CST";
    
        // 解析日期时,下面这个格式是通用的
        SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        
        // 目标格式
        SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = formatter1.parse(src);
            String dateStr = formatter2.format(date);
            System.out.println(dateStr);   // 2019-09-08 19:49:57
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    

      

    /**
     * 生成GMT格式的时间:Thu, 15 Sep 2011 12:13:41 GMT
     */
    @Test
    public void testToGMT() {
        SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        String str = formatter.format(new Date());
        System.out.println(str); // Sun, 08 Sep 2019 23:01:35 GMT
    }
    

      

    /**
     * 时间计算
     *
     * @param datatime 字符串形式的日期时间,比如2019-10-09 20:03:00
     * @param seconds  增减多少秒
     * @return
     */
    public String computeDateTime(String datatime, int seconds) {
        if (seconds == 0) {
            return datatime;
        }
    
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = formatter.parse("2019-10-09 20:03:00");
            long resMillSecond = date.getTime() + seconds * 1000;
            return formatter.format(new Date(resMillSecond));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
        return datatime;
    }
    
    public void testTime() throws ParseException {
        System.out.println(computeDateTime("2018-10-09 20:03:00", 4));  // 2018-10-09 20:02:56
        System.out.println(computeDateTime("2018-10-09 20:03:00", -4)); // 2018-10-09 20:03:04
    }
    

      

    5、月份对应的英文

    月份 英文
    1月  January
    2月  February
    3月 march 
    4月 April 
    5月  May
    6月  June
    7月  July
    8月  August
    9月  September
    10月  October
    11月 November 
    12月  December

     

  • 相关阅读:
    4.C#的选择语句练习
    3.C#中的选择语句
    java包静态导入,继承
    新的学期要继续学习喽
    桌球小游戏
    JAVA和C语言的区别
    BIV+CSS网页的标准化布局
    层叠样式表
    学PHP也要懂得HTML
    web开发入门
  • 原文地址:https://www.cnblogs.com/-beyond/p/11462323.html
Copyright © 2011-2022 走看看