【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月。
日期是有大小关系的,时间靠后,时间越大。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值