23 Date类

java.util.Date:表示日期和时间的类

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

毫秒:千分之一秒 1000毫秒=1秒

2088-08-08 09:55:33:333 瞬间

2088-08-08 09:55:33:334 瞬间

毫秒值的作用:可以对时间和日期进行计算

2099-01-03 到 2088-01-01 中间一共有多少天

可以把日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期

把日期转换为毫秒

当前的日期:2088-01-01

时间原点(0毫秒的时间):1970 年 1 月 1 日 00:00:00(英国格林威治)

就是计算当前日期到时间原点之间一共经历了多少毫秒(1639553506741L)

注意:

  • 中国属于东八区,会把时间增加8个小时
  • 1970 年 1 月 1 日 08:00:00

把毫秒转换为日期

  • 1 天 = 24 × 60 × 60 = 86400 秒。 = 86400 x 1000 = 86400 000 毫秒
package com.tipdm.Demo02;

/**
 * java.util.Date:表示日期和时间的类
 * 类 Date 表示特定的瞬间,精确到毫秒。
 * 毫秒:千分之一秒  1000毫秒=1秒
 * 2088-08-08 09:55:33:333 瞬间
 * 2088-08-08 09:55:33:334 瞬间
 * ...
 * 毫秒值的作用:可以对时间和日期进行计算
 * 2099-01-03 到 2088-01-01  中间一共有多少天
 * 可以把日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期
 *
 * 把日期转换为毫秒
 *      当前的日期:2088-01-01
 *      时间原点(0毫秒的时间):1970 年 1 月 1 日 00:00:00(英国格林威治)
 *      就是计算当前日期到时间原点之间一共经历了多少毫秒(1639553506741L)
 * 注意:
 *      中国属于东八区,会把时间增加8个小时
 *      1970 年 1 月 1 日 08:00:00
 *
 * 把毫秒转换为日期
 *      1 天 = 24 × 60 × 60 = 86400 秒。 = 86400 x 1000 = 86400 000 毫秒
 */

public class demo1Date {
    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());  // 获取当前系统时间一共到1970 年 1 月 1 日 00:00:00 经历了多少毫秒

    }
}

23.1 Date构造方法

  1. Date() 获取当前系统的日期和时间
  2. Date(long date):传递毫秒值,把毫秒值转换为Date日期
package com.tipdm.Demo02;

import java.util.Date;

public class demo2Date {
    public static void main(String[] args) {
        demo01();
        System.out.println("=============");
        demo02();
        System.out.println("=============");
    }

    /**
     * Date类的带参数构造方法
     * Date(long date):传递毫秒值,把毫秒值转换为Date日期
     */
    private static void demo02() {
        Date date = new Date(0L);
        System.out.println(date);  // Thu Jan 01 08:00:00 CST 1970

        date = new Date(1639553506741L);
        System.out.println(date);  // Thu Jan 01 08:00:00 CST 1970
    }

    /**
     * Date类的空参数构造方法
     * Date() 获取当前系统的日期和时间
     */
    private static void demo01() {
        Date date = new Date();
        System.out.println(date);  // Wed Dec 15 15:37:49 CST 2021
    }
}

23.2 long getTime() 把日期转换为毫秒值

package com.tipdm.Demo02;

import java.util.Date;

public class demo2Date {
    public static void main(String[] args) {
        demo03();

    }

    /**
     * long getTime() 把日期转换为毫秒值
     * 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
     */
    private static void demo03() {
        Date date = new Date();
        long time = date.getTime();
        System.out.println(time);  // Thu Jan 01 08:00:00 CST 1970
    }
}

24 DateFormat类

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” --> “2021-12-15 15:54:30”

注意:

模式中的字母不能更改,连接模式的符号可以改变

“yyyy年MM月dd日 HH时mm分ss秒” --> “2021年12月15日 15时54分30秒”

24.1 String format(Date date)

package com.tipdm.Demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.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”  --> "2021-12-15 15:54:30"
 *          注意:
 *              模式中的字母不能更改,连接模式的符号可以改变
 *              “yyyy年MM月dd日 HH时mm分ss秒”  --> "2021年12月15日 15时54分30秒"
 */
public class demo3DateFormat {
    public static void main(String[] args) throws ParseException {
        demo01();
    }


    /**
     * 使用DateFormat类中的方法format,把日期格式化为文本
     * 使用步骤:
     *      1. 创建SimpleDateFormat对象,构造方法中传递指定的模式
     *      2. 调用SimpleDateFormat对象中的方法format,按照构造方法中指定的模式,把Date日期格式化为符合模式的字符串(文本)
     */
    private static void demo01() {
        // 1. 创建SimpleDateFormat 对象,构造方法中传递指定的模式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 'at' HH时mm分ss秒");
        // 2. 调用SimpleDateFormat 对象中的方法format,按照构造方法中指定的模式,把Date日期格式化为符合模式的字符串(文本)
        // String format(Date date)  按照指定的模式,把Date日期,格式化为符合模式的字符串
        Date date = new Date();
        String d = sdf.format(date);
        System.out.println(d);
    }
}

24.2 Date parse(String source)

package com.tipdm.Demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.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”  --> "2021-12-15 15:54:30"
 *          注意:
 *              模式中的字母不能更改,连接模式的符号可以改变
 *              “yyyy年MM月dd日 HH时mm分ss秒”  --> "2021年12月15日 15时54分30秒"
 */
public class demo3DateFormat {
    public static void main(String[] args) throws ParseException {
        demo02();
    }

    /**
     * 使用DateFormat类中的方法parse,把文本解析为日期
     * 使用步骤:
     *      1. 创建SimplelDateFormat对象,构造方法中传递的模式
     *      2. 调用SimplelDateFormat对象中的方法parse,把符合构造方法中模式的字符串,解析为Date日期
     *      注意:
     *          public Date parse(String source) throws parseException
     *          parse方法声明了一个异常叫parseException
     *          如果字符串和构造方法的模式不一样,那么程序就会抛出异常
     *          调用一个抛出了异常的方法,就必须的处理这个异常,要么throws继续抛出这个异常,要么try catch自己处理
     */
    private static void demo02() throws ParseException {
        // 1. 创建SimpleDateFormat 对象,构造方法中传递指定的模式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 'at' HH时mm分ss秒");
        // 2. 调用SimplelDateFormat对象中的方法parse,把符合构造方法中模式的字符串,解析为Date日期
        Date date = sdf.parse("2021年12月15日 at 16时01分18秒");
        System.out.println(date);  // Wed Dec 15 16:01:18 CST 2021
        System.out.println(date.getTime());  // 1639555278000

//        Date date1 = sdf.parse("2021年12月15日 at 16时01分18");  // ParseException  抛出解析异常
//        System.out.println(date1);
    }
}

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

package com.tipdm.Demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 练习:
 *      请使用日期时间相关的API,计算出一个人已经出生了多少天。
 * 分析:
 *      1. 使用Scanner类中的方法next,获取出生日期
 *      2. 使用DateFormat类中的方法parse,把字符串的出生日期,解析为Date格式的出生日期
 *      3. 把Date格式的出生日期转换为毫秒值
 *      4. 获取当前的日期,转换为毫秒值
 *      5. 使用当前日期的毫秒值-出生日期的毫秒值
 *      6. 把毫秒值转换为天
 */
public class demo4Test {
    public static void main(String[] args) throws ParseException {
        // 获取用户输入出生日期
        System.out.print("请输入出生日期(格式:yyyy-MM-dd)")
        Scanner sc = new Scanner(System.in);
        String Birthday = sc.next();
        // 设置时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 输入的String格式的日期转化为标准Date格式
        Date date = sdf.parse(Birthday);
        // 将日期转化为毫秒
        long birthMS = date.getTime();

        // 获取系统当前日期
        Date now = new Date();
        // 将当前日期转化为毫秒
        long nowMS = now.getTime();

        // 计算当前日期与出生日期的毫秒查
        long deltaMS = nowMS - birthMS;
        // 将毫秒转化为天
        double deltaDays = deltaMS / 86400000;
        System.out.println("距离您出生已经:" + deltaDays + "天了");
    }
}