【Java基础】13.Date日期时间、SimpleDateFormat、Calendar类


前言

java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。

Date( )

第二个构造函数接收一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数。

Date(long millisec)

一、Date常用API

Date 对象创建以后,可以调用下面的方法。

package com.zh.d1_date;

import java.util.Date;

/**
 * @ClassName: DateDemo1
 * @Description: Date日期时间
 * @author: Zh
 * @date: 2024/4/11 20:12
 */
public class DateDemo1 {
    public static void main(String[] args) {
        // 1、创建一个Date类的对象:代表系统此刻日期时间对象
        Date d = new Date();
        System.out.println("当前时间:" + d); // 当前时间:Thu Apr 11 20:32:52 CST 2024

        // 2、返回自1970年1月1日0点0分0秒(UTC)以来的毫秒数。
        long time = d.getTime();
        System.out.println("毫秒数:" + time); // 毫秒数:1712838772301

        System.out.println("----当前时间往后走 1小时 121s的时间----");
        // 当前时间往后走 1小时 121s
        long time2 = System.currentTimeMillis();
        time2 += (60 * 60 + 121) * 1000;
        // 把时间毫秒值转换成对应的日期对象。
        Date d1 = new Date(time2);
        System.out.println("1小时121s之后时间:" + d1); // 1小时121s之后时间:Thu Apr 11 21:34:53 CST 2024
        // 也可以用setTime方法
        Date d2 = new Date();
        d2.setTime(time2);
        System.out.println("1小时121s之后时间:" + d2); // 1小时121s之后时间:Thu Apr 11 21:34:53 CST 2024

        // 3、equals调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
        boolean rs = d.equals(d1);
        boolean rs1 = d1.equals(d2);
        System.out.println("equals比较结果rs:" + rs); // equals比较结果rs:false
        System.out.println("equals比较结果rs1:" + rs1); // equals比较结果rs1:true

        // 4、before调用此方法的Date对象在指定日期之前返回true,否则返回false。
        boolean rs2 = d.before(d1);
        System.out.println("before比较结果rs2:" + rs2); // before比较结果rs2:true

        // 5、after调用此方法的Date对象在指定日期之后返回true,否则返回false。
        boolean rs3 = d.after(d1);
        System.out.println("after比较结果rs3:" + rs3); // after比较结果rs3:false

    }
}

编译运行结果如下:

当前时间:Thu Apr 11 20:32:52 CST 2024
毫秒数:1712838772301
----当前时间往后走 1小时 121s的时间----
1小时121s之后时间:Thu Apr 11 21:34:53 CST 2024
1小时121s之后时间:Thu Apr 11 21:34:53 CST 2024
equals比较结果rs:false
equals比较结果rs1:true
before比较结果rs2:true
after比较结果rs3:false

二、SimpleDateFormat 格式化日期

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。
语法:

SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");

这一行代码确立了转换的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。
注意:有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制。
实例:

package com.zh.d2_simpledateformat;

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

/**
 * @ClassName: SimpleDateFormatDemo01
 * @Description: SimpleDateFormat格式化日期
 * @author: Zh
 * @date: 2024/4/11 20:37
 */
public class SimpleDateFormatDemo01 {
    public static void main(String[] args) throws ParseException {
        // 1、日期对象
        Date d = new Date();
        System.out.println("当前时间:" + d);

        // 2、格式化这个日期对象 (指定最终格式化的形式)
        // y年 M月 d日 H时 m分 s秒 EEE取星期几 a取上午还是下午
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 3、开始格式化日期对象成为喜欢的字符串形式
        String rs = sdf.format(d);
        System.out.println("格式化以后的时间:" + rs);
        String rs1 = sdf1.format(d);
        System.out.println("格式化以后的时间:" + rs1);

        // 4、格式化时间毫秒值
        // 12个小时后的时间是多少
        long time1 = System.currentTimeMillis() + 12 * 60 * 60 * 1000;
        String rs2 = sdf.format(time1);
        System.out.println("12小时后:" + rs2);

        System.out.println("----使用SimpleDateFormat解析字符串时间成为日期对象----");
        // 5、使用SimpleDateFormat解析字符串时间成为日期对象。
        // 时间 2022年08月06日 11:12:44 往后 2天 14小时 49分 06秒后的时间是多少。
        // 把字符串时间拿到程序中来
        String dateStr = "2022年08月06日 11:12:44";
        System.out.println("原本时间:" + dateStr);
        // 把字符串时间解析成日期对象(本节的重点)
        // 形式必须与被解析时间的形式完全一样,否则运行时解析报错!
        // 固定日期格式
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        // 将字符串变为固定的日期格式
        Date d1 = sdf2.parse(dateStr);
        System.out.println("解析成日期对象:" + d1);
        // 往后走2天 14小时 49分 06秒
        // long类型参数的构造函数,用于进行long–>date的转换
        // 如果不加L,是int类型的计算,怕数组越界
        long time = d1.getTime() + (2L * 24 * 60 * 60 + 14 * 60 * 60 + 49 * 60 + 6) * 1000;
        // 格式化这个时间毫秒值就是结果
        System.out.println("2天14小时49分06秒后:" + sdf2.format(time));
    }
}

编译运行结果如下:

当前时间:Thu Apr 11 20:48:44 CST 2024
格式化以后的时间:2024041120:48:44 周四 下午
格式化以后的时间:2024-04-11 20:48:44
12小时后:2024041208:48:44 周五 上午
----使用SimpleDateFormat解析字符串时间成为日期对象----
原本时间:2022080611:12:44
解析成日期对象:Sat Aug 06 11:12:44 CST 2022
214小时4906秒后:2022080902:01:50

三、Calendar类

已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。
Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
Calendar日历类创建日历对象的语法:

Calendar rightNow = Calendar.getInstance();

实例:

package com.zh.d3_calendar;

import java.util.Calendar;
import java.util.Date;

/**
 * @ClassName: CalendarDemo
 * @Description: Calendar日历类
 * Calendar代表了系统此刻日期对应的日历对象,是一个抽象类,不能直接创建对象。
 * Calendar日历类创建日历对象的语法:Calendar rightNow = Calendar.getInstance();
 * Calendar的方法:
 * 1.public static Calendar getInstance(): 返回一个日历类的对象。
 * 2.public int get(int field):取日期中的某个字段信息。
 * 3.public void set(int field,int value):修改日历的某个字段信息。
 * 4.public void add(int field,int amount):为某个字段增加/减少指定的值
 * 5.public final Date getTime(): 拿到此刻日期对象。
 * 6.public long getTimeInMillis(): 拿到此刻时间毫秒值
 * @author: Zh
 * @date: 2024/4/11 20:53
 */
public class CalendarDemo {
    public static void main(String[] args) {
        // 1、拿到系统此刻日历对象
        Calendar cal = Calendar.getInstance();
        System.out.println("此刻日历对象:" + cal);

        // 2、获取日历的信息:public int get(int field):取日期中的某个字段信息。
        int year = cal.get(Calendar.YEAR);
        System.out.println("现在的年:" + year);

        int mm = cal.get(Calendar.MONTH) + 1;
        System.out.println("现在的月:" + mm);

        int days = cal.get(Calendar.DAY_OF_YEAR);
        System.out.println("一年中的第几天:" + days);

        // 3、public void set(int field,int value):修改日历的某个字段信息。
        cal.set(Calendar.YEAR, 2022);
        int year1 = cal.get(Calendar.YEAR);
        System.out.println("修改后的年:" + year1);

        // 4.public void add(int field,int amount):为某个字段增加/减少指定的值
        // 64天后是什么时间
        cal.add(Calendar.DAY_OF_YEAR, 64);
        int days1 = cal.get(Calendar.DAY_OF_YEAR);
        System.out.println("64天后是第几天:" + days1);

        //  5.public final Date getTime(): 拿到此刻日期对象。
        Date d = cal.getTime();
        System.out.println("此刻日期对象:" + d);

        //  6.public long getTimeInMillis(): 拿到此刻时间毫秒值
        long time = cal.getTimeInMillis();
        System.out.println("此刻时间毫秒值:" + time);

    }
}

编译运行结果如下:

此刻日历对象:java.util.GregorianCalendar[time=1712840426064,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2024,MONTH=3,WEEK_OF_YEAR=15,WEEK_OF_MONTH=2,DAY_OF_MONTH=11,DAY_OF_YEAR=102,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=0,SECOND=26,MILLISECOND=64,ZONE_OFFSET=28800000,DST_OFFSET=0]
现在的年:2024
现在的月:4
一年中的第几天:102
修改后的年:2022
64天后是第几天:165
此刻日期对象:Tue Jun 14 21:00:26 CST 2022
此刻时间毫秒值:1655211626064
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值