日期时间类

1、Date类

现实生活中,日期时间类的数据很常见。Java中提供了Date类来封装当前的时间类和日期。api文档说明如下:
在这里插入图片描述

1.1、构造方法

在这里插入图片描述
很多构造方法都已经被弃用了,目前Date类的构造方法就两种:

  • Date():分配一个Date对象并对其进行初始化,以便它表示分配的时间,测量到最近的毫秒,即获取到系统的当前时间。
  • Date(long date):接受一个long型的参数,分配一个Date对象,并将其初始化为表示从标准基准时间(称为“时代”)即1970年1月1日00:00:00 GMT起的指定毫秒数。
    public static void main(String[] args) {
        Date d1 = new Date();
        // 获取当前时间的毫秒数
        long mils = d1.getTime();
        System.out.println("当前日期:" + d1);
        Date d2 = new Date(mils);
        System.out.println("当前日期:" + d2);
    }

控制台:
在这里插入图片描述

1.2、常用方法

Date类提供的方法如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Date类的大部分方法都被弃用了,官方不再提倡我们使用,取而代之的是DateFormat类和Calendar类中的方法,现对Date类未被弃用的一些常用方法进行说明:

  • after(Date d):测试此日期是否在给定日期之后,返回布尔值。
  • before(Date d):测试此日期是否在给定日期之前,返回布尔值。
  • compareTo(Date d):比较,一样返回0,在之前返回-1,在之后返回1。
  • equals(Object obj):比较两个日期是否相等,返回布尔值。
  • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数,返回long型数据。
  • setTime(long time):用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
  • hashCode():返回此日期的哈希码值。
  • toString():转为String串。

1.3、日期的格式化

有时候需要将日期按照指定的格式来进行输出,这时可以使用SimpleDateFormat类来格式化日期。SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。使用该类可以轻松的实现日期和文本之间的相互转换。api文档中说明如下:
在这里插入图片描述
常用的符号说明如下:
在这里插入图片描述
符号说明:
在这里插入图片描述
构造方法如下:
在这里插入图片描述
提供的方法如下:
在这里插入图片描述
在这里插入图片描述
用的较多的是以下两种方法:

  • format(Date d):将日期转换为字符串形式,返回String类型。
  • parse(String s):将字符串转换为日期格式,返回Date类型,但是s的格式还是要满足日期格式的要求,否则识别不了会转换失败。

以下通过两个例子来说明:

    public static void main(String[] args) {
        Date d1 = new Date();
        // 获取当前时间的毫秒数
        long mils = d1.getTime();
        long mils2 = d1.getTime() + 10000000;
        // 重设d1日期
        d1.setTime(mils2);
        Date d2 = new Date(mils);
        Date d3 = new Date(mils2);
        System.out.println();
        System.out.println("d1日期:" + d1);
        System.out.println("d2日期:" + d2);
        System.out.println("d3日期:" + d3);
        System.out.println("d2在d3之前吗?" + d2.before(d3));
        System.out.println("d2在d3之后吗?" + d2.after(d3));
        System.out.println("d2和d3是同一个时间吗?" + d2.equals(d3));
        System.out.println("d2的哈希码值:" + d2.hashCode());
        System.out.println("d3的哈希码值:" + d3.hashCode());
        System.out.println(d2.compareTo(d3));
        System.out.println(d3.toString());
    }

控制台:
在这里插入图片描述
定义一个实体类Student:

public class Student {

    private String name;

    private String sex;

    private Date birth;

    public Student(String name, String sex, Date birth) {
        this.name = name;
        this.sex = sex;
        this.birth = birth;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }
    
}

测试:

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("开始录入学生信息!");
        System.out.println("请输入姓名:");
        String name = in.next();
        System.out.println("请输入性别:");
        String sex = in.next();
        System.out.println("请输入出生年份:");
        int year = in.nextInt();
        System.out.println("请输入出生月份:");
        int month = in.nextInt();
        System.out.println("请输入出生的日");
        int day = in.nextInt();
        String birthStr = year + "-" + month + "-" + day;
        Student stu = new Student(name, sex, stringToDate("yyyy-MM-dd", birthStr));
        System.out.println("-----------------------");
        System.out.println("学生信息如下:");
        System.out.println("姓名:" + stu.getName());
        System.out.println("性别:" + stu.getSex());
        System.out.println("出生日期:" + dateToString("yyyy年MM月dd日", stu.getBirth()));
    }

    // 定义一个方法,将字符串转换为日期
    private static Date stringToDate(String pattern, String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        try {
            Date date = simpleDateFormat.parse(dateStr);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 定义一个方法,日期转换为字符串
    private static String dateToString(String pattern, Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        String dateStr = simpleDateFormat.format(date);
        return dateStr;
    }

执行,控制台:
在这里插入图片描述

2、Calendar类

使用Date类已经能够格式化并创建一个日期对象了,但是如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟, 又如何在日期的这些部分加上或者减去值呢, 这时可以使用Calendar 类。Calendar类的功能要比Date类强大很多,在实现方式上稍微复杂一些。

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,使用getInstance方法创建即可。api文档说明如下:
在这里插入图片描述
如果我现在想获取一个Calendar对象,那么只需:

Calendar cal = Calendar.getInstance();

因为Calendar是抽象类,自身是不能实例化的,Calendar.getInstance()来获取一个Calendar对象。

常用的常量如下:
在这里插入图片描述
提供的方法如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
常用的方法说明如下:

  • add(int field, int amount):根据日历的规则,将指定的时间量添加或减去给定的日历字段。
  • after(Object when):返是否在日期之后,返回布尔值。
  • before(Object when):返是否在日期之前,返回布尔值。
  • clear(int field):清除指定字段的值。
  • compareTo(Calendar cal):比较前后,在之前返回-1,一样返回0,在之后返回1。
  • equals(Object obj):比较两个日期是否相同,返回布尔值。
  • get(int field):返回给定日历字段的值。
  • Calendar.getInstance() :获取一个Calendar对象。
  • getTime():返回一个Date表示此物体Calendar的时间值
  • set(…):设置日历中的字段值,此方法有多个重载方法。

以下用代码测试:

    public static void main(String[] args) {
        // 获取Calendar对象
        Calendar cal = Calendar.getInstance();
        // 设置日历字段
        cal.set(1995, 9, 18);
        // 获取日历中的字段
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH );
        int day = cal.get(Calendar.DAY_OF_MONTH);
        String dateStr = year + "年" + month + "月" + day + "日";
        System.out.println(dateStr);
        Date date = cal.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf.format(date));
    }

控制台:
在这里插入图片描述
这里其实可以看到一个问题,那就是Calendar在转为Date类型的时候,月份是不一样的,Calendar中的0-11代表1-12月,也就是说上面的9其实是表示的10月份,那么在转换的时候可以将month减去1。

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Student stu0 = new Student();
        Student stu2 = new Student();
        System.out.println("开始录入第一个人的信息!");
        System.out.println("请输入姓名:");
        String name0 = in.next();
        System.out.println("请输入性别:");
        String sex0 = in.next();
        System.out.println("请输入出生年份:");
        int year = in.nextInt();
        System.out.println("请输入出生月份:");
        int month0 = in.nextInt();
        System.out.println("请输入出生的日:");
        int day0 = in.nextInt();
        stu0.setName(name0);
        stu0.setSex(sex0);
        Calendar cal0 = Calendar.getInstance();
        cal0.set(year, month0 - 1, day0);
        Date d0 = cal0.getTime();
        stu0.setBirth(d0);
        System.out.println("---------------------");
        System.out.println("开始录入第二个人的信息!");
        System.out.println("请输入姓名:");
        String name2 = in.next();
        System.out.println("请输入性别:");
        String sex2 = in.next();
        System.out.println("请输入出生年份:");
        int year2 = in.nextInt();
        System.out.println("请输入出生月份:");
        int month2 = in.nextInt();
        System.out.println("请输入出生的日:");
        int day2 = in.nextInt();
        stu2.setName(name2);
        stu2.setSex(sex2);
        Calendar cal2 = Calendar.getInstance();
        cal2.set(year2, month2 - 1, day2);
        Date d2 = cal2.getTime();
        stu2.setBirth(d2);
        System.out.println("----------------------------");
        System.out.println("第一个人信息如下:");
        System.out.println("姓名:" + stu0.getName());
        System.out.println("性别:" + stu0.getSex());
        System.out.println("出生日期:" + dateToString("yyyy年MM月dd日", stu0.getBirth()));
        System.out.println("----------------------------");
        System.out.println("第二个人信息如下:");
        System.out.println("姓名:" + stu2.getName());
        System.out.println("性别:" + stu2.getSex());
        System.out.println("出生日期:" + dateToString("yyyy年MM月dd日", stu2.getBirth()));
        System.out.println("第一个人出生在第二个人之前吗?" + cal0.before(cal2));
    }

    // 定义一个方法,日期转换为字符串
    private static String dateToString(String pattern, Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        String dateStr = simpleDateFormat.format(date);
        return dateStr;
    }

执行,控制台:
在这里插入图片描述
在这里插入图片描述

3、GregorianCalendar类

Calendar类实现了公历日历,该类是Calendar类的一个具体实现。Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。

构造方法如下:
在这里插入图片描述
提供的方法如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下用代码说明:

    public static void main(String[] args) {
        GregorianCalendar calendar = new GregorianCalendar();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        System.out.println("当前日期为:" + year + "年" + (month + 1) + "月" + day + "日!");
        System.out.println("当前时间为:" + hour + "时" + minute + "分" + second + "秒!");
        if (calendar.isLeapYear(year)) {
            System.out.println("当前年份是闰年!");
        } else {
            System.out.println("当前年份不是闰年!");
        }
    }

执行,控制台:
在这里插入图片描述

4、总结

日期时间类在实际中用的比较多,掌握Date类、Calendar类,以及Calendar类的子类GregorianCalendar的定义和一些常用方法,掌握日期和字符串的相互转换,在开发中肯定会用到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值