Java中的日期类

一、Date类

1.1、Date概述

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

继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数

  • public Date():从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
  • public Date(long date):将指定参数的毫秒值date,转换成Date对象,分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。

说明:由于中国处于东八区(GMT+08:00)是比世界协调时间/格林尼治时间(GMT)快8小时的时区,当格林尼治标准时间为0:00时,东八区的标准时间为08:00。

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

package com.demo.demo01;

import java.util.Date;

public class Demo01Date {
    public static void main(String[] args) {
        // 创建日期对象,把当前的时间
        System.out.println(new Date()); // Thu Aug 01 14:15:36 CST 2024
        // 创建日期对象,把当前的毫秒值转成日期对象
        System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
    }
}

1.2、构造方法

方法名说明
public Date()分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
public Date(long date)分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
package com.demo.demo01;

import java.util.Date;

/**
 * @Author: 史小创
 * @Time: 2024/8/1 下午2:20
 * @Description: Date的构造方法
 */

public class Demo02Date {
    public static void main(String[] args) {
        // public Date():分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
        Date date = new Date();

        // 内部的Date类,肯定将toString方法进行了重写,所以我们得到的不是一个地址;
        System.out.println(date);

        // 使用本地化的一个字符串形式来查看日期
        System.out.println(date.toLocaleString());

        // public Date(long date):分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
        Date date1 = new Date(10000);
        System.out.println(date1.toLocaleString());
    }
}

image-20240801142235299

1.3、常用的API

package com.demo.demo01;

import java.util.Date;

/**
 * @Author: 史小创
 * @Time: 2024/8/1 下午2:24
 * @Description: Date的常用API
 */

public class Demo03Date {
    public static void main(String[] args) {
        System.out.print("getTime获取时间的毫秒数:");
        System.out.println(new Date().getTime());

        System.out.println("两个日期进行比较:");
        Date date1 = new Date();
        Date date2 = new Date(date1.getTime() + 10000);
        System.out.println(date2.compareTo(date1));

        // equals方法:用于2个日期的比较(与元年所相差的毫秒数是一样的则返回true,否则返回false)
        // 注意!Object类中的equals方法比较的是对象的内存地址,而在Date中则不同,说明在Date类中equals方法是重写过的,比较的是相差的毫秒数;
        boolean is = date2.equals(date1);
        System.out.println(is);

        Date date3 = new Date(date1.getTime());
        is = date1.equals(date3);
        System.out.println(is);
    }
}

image-20240801143709788

1.4 、附加内容

在Java语言中,除了java.util包下有一个Date类之外,在java.sql包下也有一个Date类,都是用于表示日期的。

  • 1、java.util.Date 是 java.sql.Date的父类;

  • 2、java.util.Date是用于Java程序中(Java类);

  • 3、java.sql.Date是用于数据库结合操作的类型;

Java程序(日期) -------------------------添加数据--------------------------数据库中

数据库中数据(日期)----------------------查询-----------------------Java程序中

以上的这个操作过程是在所难免的,那么必然会涉及到java.util.Date 与 java.sql.Date之间的转换。

package com.demo.demo01;

import java.sql.Date;

/**
 * @Author: 史小创
 * @Time: 2024/8/1 下午2:33
 * @Description: java.util.Date 与 java.sql.Date之间的转换。
 */

public class Demo04Date {
    public static void main(String[] args) {
        // 将sql包的下Date-----转换为------util包下的Date

        // 想定义一个2000-12-12的日期,可以使用java.sql.Date

        // 将字符串转换为sql包下的Date的做法
        java.sql.Date date = java.sql.Date.valueOf("2000-12-12");
        System.out.println(date);

        // 如何将这个date日期转换为 java.util.Date
        Date myDate = new Date(date.getTime());
        System.out.println(myDate.toLocaleString());

        // 如何将util包下的Date-------转换为------sql包下的Date
        java.sql.Date myDate1 = new java.sql.Date(myDate.getTime());
        System.out.println(myDate1);
    }
}

image-20240801143728811

二、SimpleDateFormat工具类

SimpleDateFormat类概述:SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。

SimpleDateFormat类构造方法

方法名说明
public SimpleDateFormat()构造一个SimpleDateFormat,使用默认模式和日期格式
public SimpleDateFormat(String pattern)构造一个SimpleDateFormat使用给定的模式和默认的日期格式

SimpleDateFormat类的常用方法

  • 格式化(从Date到String)
    • public final String format(Date date):将日期格式化成日期/时间字符串
  • 解析(从String到Date)
    • public Date parse(String source):从给定字符串的开始解析文本以生成日期
package com.demo.demo01;

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

/**
 * @Author: 史小创
 * @Time: 2024/8/1 下午2:40
 * @Description: SimpleDateFormat工具类
 */

public class Demo05Date {
    public static void main(String[] args) throws ParseException {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(date);
        System.out.println(s);

        System.out.println("--------");

        // 从 String 到 Date
        String ss = "2048-08-09 11:11:11";
        // ParseException
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dd = sdf2.parse(ss);
        System.out.println(dd);

        System.out.println("--------");

        try {
            // 定义的字符串的格式必须要和定义的模式一致,否则会抛出异常
            java.util.Date myDate = sdf2.parse("2000-10-10  10-10-10");
            System.out.println(myDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }
}

image-20240801144452295

提示!

对于编写格式所使用的各种代表字母符号,掌握常规的年月日时分秒即可,其余了解即可。

三、Calendar日历

Calendar类概述

  • Calendar 为特定瞬间与一组日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法

  • Calendar 提供了一个类方法 getInstance 用于获取这种类型的一般有用的对象。

  • 该方法返回一个Calendar 对象。

  • 其日历字段已使用当前日期和时间初始化:Calendar rightNow = Calendar.getInstance();

Calendar类常用方法

方法名说明
public int get(int field)返回给定日历字段的值
public abstract void add(int field, int amount)根据日历的规则,将指定的时间量添加或减去给定的日历字段
public final void set(int year,int month,int date)设置当前日历的年月日
package com.demo.demo01;

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

public class CalendarDemo {
    public static void main(String[] args) throws ParseException {
        // 获取日历类对象
        Calendar c = Calendar.getInstance();

        // public int get(int field):返回给定日历字段的值
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH) + 1;
        int date = c.get(Calendar.DATE);
        System.out.println(year + "年" + month + "月" + date + "日");

        // public abstract void add(int field, int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段
        System.out.println("需求1:3年前的今天");
        c.add(Calendar.YEAR, -3);
        year = c.get(Calendar.YEAR);
        month = c.get(Calendar.MONTH) + 1;
        date = c.get(Calendar.DATE);
        System.out.println(year + "年" + month + "月" + date + "日");

        System.out.println("需求2:10年后的10天前");
        c.add(Calendar.YEAR, 10);
        c.add(Calendar.DATE, -10);
        year = c.get(Calendar.YEAR);
        month = c.get(Calendar.MONTH) + 1;
        date = c.get(Calendar.DATE);
        System.out.println(year + "年" + month + "月" + date + "日");

        // public final void set(int year,int month,int date):设置当前日历的年月日
        c.set(2050, 10, 10);
        year = c.get(Calendar.YEAR);
        month = c.get(Calendar.MONTH) + 1;
        date = c.get(Calendar.DATE);
        System.out.println(year + "年" + month + "月" + date + "日");

        System.out.println("计算两个日期的时间差:");
        calculateTimeDifferenceByCalendar("2008/08/08");
    }

    /**
     * 使用Calendar对象计算时间差,可以按照需求定制自己的计算逻辑
     *
     * @param strDate
     * @throws ParseException
     */
    public static void calculateTimeDifferenceByCalendar(String strDate) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
        Date date = formatter.parse(strDate);
        Calendar c1 = Calendar.getInstance();   // 当前日期
        Calendar c2 = Calendar.getInstance();
        c2.setTime(date);   // 设置为另一个时间

        int year = c1.get(Calendar.YEAR);
        int oldYear = c2.get(Calendar.YEAR);

        // 这里只是简单的对两个年份数字进行相减,而没有考虑月份的情况
        System.out.println("传入的日期与今年的年份差为:" + (year - oldYear));
    }
}

image-20240801150011176

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值