【Java】日期时间类

目录

一、Date类

1、概述

2、常用方法

二 、DateFormat类

1、概述

2、构造方法

3、格式规则

4、常用方法

(1)format方法

 (2)parse方法

三、练习

四、Calendar类

1、概念

2、获取方式

3、常用方法


一、Date类

1、概述

    java.util.Date:表示日期和时间的类
    类 Date 表示特定的瞬间,精确到毫秒。
    毫秒:千分之一秒 1000毫秒=1秒
    特定的瞬间:一个时间点,一刹那时间
    2088-08-08 09:55:33:333 瞬间
    2088-08-08 09:55:33:334 瞬间
    2088-08-08 09:55:33:334 瞬间
    ...
    毫秒值的作用:可以对时间和日期进行计算
    2020-10-07 到 2022-01-20 中间一共有多少天
    可以日期转换为毫秒进行计算,计算完毕,在把毫秒转换为日期

    把日期转换为毫秒:
        当前的日期:2088-01-01
        时间原点(0毫秒):1970 年 1 月 1 日 00:00:00(英国格林威治)
        就是计算当前日期到时间原点之间一共经历了多少毫秒 (3742767540068L)
    注意:
        中国属于东八区,会把时间增加8个小时
        1970 年 1 月 1 日 08:00:00

    把毫秒转换为日期:
        1 天 = 24 × 60 × 60 = 86400 秒  = 86400 x 1000 = 86400000毫秒

2、常用方法

java.util.Date 类 表示特定的瞬间,精确到毫秒。

public Date()    分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。

public Date(long date)     分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为 “ 历 元(epoch) ”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。

简单来说:使用无参构造,可以自动设置当前系统时间的毫秒时刻;指定 long 类型的构造参数,可以自定义毫秒时刻。例如:
import java.util.Date; 

public class Demo01Date { 
    public static void main(String[] args) { 

    // 创建日期对象,把当前的时间 
    System.out.println(new Date()); // Tue Jan 20 14:37:35 CST 2022

    // 创建日期对象,把当前的毫秒值转成日期对象 
    System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970 
    } 
}
tips: 在使用 println 方法时,会自动调用 Date 类中的 toString 方法。 Date 类对 Object 类中的 toString 方法进行了覆盖重写,所以结果为指定格式的字符串。
public long getTime() 把日期对象转换成对应的时间毫秒值。 public String toLocaleString() 根据本地格式转换日期对象
long getTime() 把日期转换为毫秒值(相当于System.currentTimeMillis()方法),返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
import java.util.Date;

public class Demo02Date {
    public static void main(String[] args) {
        demo();
    }

    /*
        long getTime() 把日期转换为毫秒值(相当于System.currentTimeMillis()方法)
          返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
     */
    private static void demo() {
        Date date = new Date();
        long time = date.getTime();
        System.out.println(time); //1642667329975
    }
}
import java.util.Date;

public class test {
    public static void main(String[] args) {
        Date d = new Date();
        System.out.println(d.toLocaleString());  // 2022年1月20日 下午8:01:46
    }
}

二 、DateFormat

1、概述

java.text.DateFormat 是日期 / 时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换, 也就是可以在 Date 对象与 String 对象之间进行来回转换。
格式化 :按照指定的格式,从 Date 对象转换为 String 对象。 解析 :按照指定的格式,从 String 对象转换为 Date 对象。

java.text.DateFormat:是日期/时间格式化子类的抽象类
    作用:
        格式化(也就是日期 -> 文本)、解析(文本-> 日期)
    成员方法:
        String format(Date date)  按照指定的模式,把Date日期,格式化为符合模式的字符串
        Date parse(String source)  把符合模式的字符串,解析为Date日期
    DateFormat类是一个抽象类,无法直接创建对象使用,可以使用DateFormat类的子类

    java.text.SimpleDateFormat extends DateFormat

    构造方法:
        SimpleDateFormat(String pattern)
          用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
        参数:
             String pattern:传递指定的模式
        模式:区分大小写的
            y   年
            M   月
            d   日
            H   时
            m   分
            s   秒
        写对应的模式,会把模式替换为对应的日期和时间
            "yyyy-MM-dd HH:mm:ss"
        注意:
            模式中的字母不能更改,连接模式的符号可以改变
             "yyyy年MM月dd日 HH时mm分ss秒"

2、构造方法

由于 DateFormat 为抽象类,不能直接使用,所以需要常用的子类 java.text.SimpleDateFormat 。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:
public SimpleDateFormat(String pattern)   用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数 pattern 是一个字符串,代表日期时间的自定义格式。

3、格式规则

标识字母(区分大小写) 含义
y
M
d
H
m
s
创建 SimpleDateFormat 对象的代码如:
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 

public class Demo02SimpleDateFormat { 
    public static void main(String[] args) { 

        // 对应的日期格式如:2022‐01‐20 15:06:38 
        DateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss"); 
    } 
}

4、常用方法

public String format(Date date) :将 Date 对象格式化为字符串。 public Date parse(String source) :将字符串解析为 Date 对象。

(1)format方法

使用 format 方法的代码为:
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

/*把Date对象转换成String */

public class Demo03DateFormatMethod {
    public static void main(String[] args) { 
        Date date = new Date(); 
        // 创建日期格式化对象,在获取格式化对象时可以指定风格 
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); 
        String str = df.format(date); 
        System.out.println(str); // 2020年01月20日 
    } 
}

 (2)parse方法

使用DateFormat类中的方法parse,把文本解析为日期

使用步骤:

1.创建SimpleDateFormat对象,构造方法中传递指定的模式

2.调用SimpleDateFormat对象中的方法parse,把符合构造方法中模式的字符串,解析为Date日期

        注意:
                public Date parse(String source) throws ParseException
                parse方法声明了一个异常叫ParseException解析异常
                如果字符串和构造方法的模式不一样,那么程序就会抛出此异常
                调用一个抛出了异常的方法,就必须的处理这个异常,要么throws继续抛出这个异常,要么try catch自己处理这个异常

使用 parse 方法的代码为:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*把String转换成Date对象 */

public class Demo04DateFormatMethod {
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        String str = "2022年01月20日";
        Date date = df.parse(str);
        System.out.println(date); // Thu Jan 20 00:00:00 CST 2022
    }
}

三、练习

练习:
        请使用日期时间相关的API,计算出一个人已经出生了多少天。

分析:
        1.使用Scanner类中的方法next,获取出生日期
        2.使用DateFormat类中的方法parse,把字符串的出生日期,解析为Date格式的出生日期
        3.把Date格式的出生日期转换为毫秒值
        4.获取当前的日期,转换为毫秒值
        5.使用当前日期的毫秒值-出生日期的毫秒值
        6.把毫秒差值转换为天(s/1000/60/60/24) 代码实现:
public static void function() throws Exception { 
    System.out.println("请输入出生日期 格式 YYYY‐MM‐dd"); 
    // 获取出生日期,键盘输入 
    String birthdayString = new Scanner(System.in).next(); 

    // 将字符串日期,转成Date对象 
    // 创建SimpleDateFormat对象,写日期模式 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy‐MM‐dd"); 
    // 调用方法parse,字符串转成日期对象 
    Date birthdayDate = sdf.parse(birthdayString); 

    // 获取今天的日期对象 
    Date todayDate = new Date(); 
    
    // 将两个日期转成毫秒值,Date类的方法getTime 
    long birthdaySecond = birthdayDate.getTime(); 
    long todaySecond = todayDate.getTime(); 
    long secone = todaySecond‐birthdaySecond; 
    
    if (secone < 0){ 
        System.out.println("还没出生呢"); 
    } 
    else { 
        System.out.println(secone/1000/60/60/24); 
    } 
}

四、Calendar

1、概念

java.util.Calendar 是日历类,在 Date 后出现,替换掉了许多 Date 的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。

2、获取方式

Calendar 为抽象类,由于语言敏感性, Calendar 类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:
Calendar 静态方法         public static Calendar getInstance()   使用默认时区和语言环境获得一个日历
例如:
import java.util.Calendar; 

public class Demo06CalendarInit { 
    public static void main(String[] args) { 
        Calendar cal = Calendar.getInstance(); 
    }
}

3、常用方法

public int get(int field)    返回给定日历字段的值。 public void set(int field, int value)    将给定的日历字段设置为给定值。 public abstract void add(int field, int amount)    根据日历的规则,为给定的日历字段添加或减去指定的时间量。 public Date getTime()    返回一个表示此 Calendar 时间值(从历元到现在的毫秒偏移量)的 Date 对象。
Calendar 类中提供很多成员常量,代表给定的日历字段:
字段值 含义
YEAR
MONTH 月(从0开始,可以+1使用
DAY_OF_MONTH 月中的天(几号)
HOUR 时(12小时制)
HOUR_OF_DAY 时(24小时制)
MINUTE
SECOND
DAY_OF_WEEK 周中的天(周几,周日为1,可以-1使用)
import java.util.Calendar;
import java.util.Date;

/*
    Calendar类的常用成员方法:
        public int get(int field):返回给定日历字段的值。
        public void set(int field, int value):将给定的日历字段设置为给定值。
        public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
        public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
    成员方法的参数:
        int field:日历类的字段,可以使用Calendar类的静态成员变量获取
            public static final int YEAR = 1;	年
            public static final int MONTH = 2;	月
            public static final int DATE = 5;	月中的某一天
            public static final int DAY_OF_MONTH = 5;月中的某一天
            public static final int HOUR = 10; 		时
            public static final int MINUTE = 12; 	分
            public static final int SECOND = 13;	秒
 */
public class Demo02Calendar {
    public static void main(String[] args) {
        demo01();
        System.out.println("==============");
        demo02();
        System.out.println("==============");
        demo03();
        System.out.println("==============");
        demo04();
    }

    /*
        public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
        把日历对象,转换为日期对象
     */
    private static void demo04() {
        //使用getInstance方法获取Calendar对象
        Calendar c = Calendar.getInstance();

        Date date = c.getTime();
        System.out.println(date);  // Thu Jan 20 19:41:43 CST 2022
    }

    /*
        public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
        把指定的字段增加/减少指定的值
        参数:
            int field:传递指定的日历字段(YEAR,MONTH...)
            int amount:增加/减少指定的值
                正数:增加
                负数:减少
     */
    private static void demo03() {
        //使用getInstance方法获取Calendar对象
        Calendar c = Calendar.getInstance();

        //把年增加2年
        c.add(Calendar.YEAR,2);
        //把月份减少3个月
        c.add(Calendar.MONTH,-3);


        int year = c.get(Calendar.YEAR);
        System.out.println(year);

        int month = c.get(Calendar.MONTH);
        System.out.println(month);//西方的月份0-11 东方:1-12

        //int date = c.get(Calendar.DAY_OF_MONTH);
        int date = c.get(Calendar.DATE);
        System.out.println(date);
    }

    /*
        public void set(int field, int value):将给定的日历字段设置为给定值。
        参数:
            int field:传递指定的日历字段(YEAR,MONTH...)
            int value:给指定字段设置的值
     */
    private static void demo02() {
        //使用getInstance方法获取Calendar对象
        Calendar c = Calendar.getInstance();

        //设置年为9999
        c.set(Calendar.YEAR,9999);
        //设置月为9月
        c.set(Calendar.MONTH,9);
        //设置日9日
        c.set(Calendar.DATE,9);

        //同时设置年月日,可以使用set的重载方法
        c.set(8888,8,8);

        int year = c.get(Calendar.YEAR);
        System.out.println(year);

        int month = c.get(Calendar.MONTH);
        System.out.println(month);//西方的月份0-11 东方:1-12

        int date = c.get(Calendar.DATE);
        System.out.println(date);
    }

    /*
        public int get(int field):返回给定日历字段的值。
        参数:传递指定的日历字段(YEAR,MONTH...)
        返回值:日历字段代表的具体的值
     */
    private static void demo01() {
        //使用getInstance方法获取Calendar对象
        Calendar c = Calendar.getInstance();
        int year = c.get(c.YEAR);
        System.out.println(year);

        int month = c.get(Calendar.MONTH);
        System.out.println(month);//西方的月份0-11 东方:1-12

        //int date = c.get(Calendar.DAY_OF_MONTH);
        int date = c.get(Calendar.DATE);
        System.out.println(date);
    }
}
西方星期的开始为周日,中国为周一。 在 Calendar 类中,月份的表示是以 0-11 代表 1-12 月。 日期是有大小关系的,时间靠后,时间越大。

 

上一篇:基站定位试用


下一篇:【原创】大叔问题定位分享(39)azkaban定期出现fullgc