java中的日期类

知识点–Date类

目标:

  • Date类的使用

路径:

  • Date类的概述
  • Date类中的构造方法
  • Date类中的常用方法

讲解:

Date类的概述

java.util.Date类 表示一个日期和时间,内部精确到毫秒。

Date类中的构造方法

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

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

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

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

import java.util.Date;

public class Demo01Date {
    public static void main(String[] args) {
          // 创建当前系统时间日期对象
        Date d1 = new Date();
        System.out.println(d1);// Tue Aug 11 10:50:43 CST 2020

        // 创建距离标准基准时间1000毫秒对应的时间日期对象
        Date d2 = new Date(1000);
        System.out.println(d2);// Thu Jan 01 08:00:01 CST 1970
    }
}

tips:在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。

Date类中的常用方法

Date类中的多数方法已经过时,常用的方法有:

  • public long getTime() 获取当前日期对象距离标准基准时间的毫秒值。
  • public void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象

示例代码

public class Test {
    public static void main(String[] args) {
        /*
            Date类的概述:java.util.Date类 表示一个日期和时间,内部精确到毫秒。
            Date类的构造方法:
                public Date():创建当前系统时间日期对象
                public Date(long date):创建距离标准基准时间,指定偏移毫秒数 对应的时间日期对象
                        标准基准时间:1970年01月01日 00:00:00
                        东八区标准基准时间:1970年01月01日 08:00:00
            Date类的成员方法:
                - public long getTime() 获取当前日期对象距离标准基准时间的毫秒值。
                - public void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
                - public boolean after(Date when) 测试此日期是否在指定日期之后。
                - public boolean before(Date when)  测试此日期是否在指定日期之前。

         */
        // 创建当前系统时间日期对象
        Date d1 = new Date();
        System.out.println(d1);// Tue Aug 11 10:50:43 CST 2020

        // 创建距离标准基准时间1000毫秒对应的时间日期对象
        Date d2 = new Date(1000);
        System.out.println(d2);// Thu Jan 01 08:00:01 CST 1970

        System.out.println("=================================");
        // 获取d1日期对象距离标准基准时间的毫秒值
        System.out.println(d1.getTime());// 1597114635573
        // 获取d2日期对象距离标准基准时间的毫秒值
        System.out.println(d2.getTime());// 1000

        System.out.println("======================================");
        // 创建距离标准基准时间1000毫秒对应的时间日期对象
        Date d3 = new Date();
        d3.setTime(1000);
        System.out.println(d3);// Thu Jan 01 08:00:01 CST 1970

        System.out.println("======================================");
        // 判断d1是否d2日期之后
        System.out.println(d1.after(d2));// true
        // 判断d1是否d2日期之前
        System.out.println(d1.before(d2));// false

    }
}
小结
Date类的概述:java.util.Date类 表示一个日期和时间,内部精确到毫秒。
Date类的构造方法:
  	public Date():创建当前系统时间日期对象
   public Date(long date):创建距离标准基准时间,指定偏移毫秒数 对应的时间日期对象
   	标准基准时间:1970年01月01日 00:00:00
       东八区标准基准时间:1970年01月01日 08:00:00
  Date类的成员方法:
   - public long getTime() 获取当前日期对象距离标准基准时间的毫秒值。
   - public void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
   - public boolean after(Date when) 测试此日期是否在指定日期之后。
   - public boolean before(Date when)  测试此日期是否在指定日期之前。

知识点–DateFormat类

目标:

  • 能够掌握DateFormat的使用

路径:

  • DateFormat类的概述
  • 格式规则
  • DateFormat类中的常用方法

讲解:

DateFormat类的概述

java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。

  • 格式化:按照指定的格式,把Date对象转换为String对象。
  • 解析:按照指定的格式,把String对象转换为Date对象。

由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:

  • public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数pattern是一个字符串,代表日期时间的自定义格式。

格式规则

常用的格式规则为:

标识字母(区分大小写) 含义
y
M
d
H
m
s

备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。

常用方法

DateFormat类的常用方法有:

  • public String format(Date date):将Date对象格式化为字符串。

  • public Date parse(String source):将字符串解析为Date对象。

public class SimpleDateFormatDemo {
    public static void main(String[] args) throws ParseException {
     // 创建日期格式化对象,指定日期格式为:yyyy-MM-dd HH:mm:ss
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // Date--->String
        Date d = new Date();
        String dateStr = sdf.format(d);
        System.out.println("dateStr:"+dateStr);// 2020-08-11 11:18:03

        // String--->Date
        String birthday = "1998-10-10 11:11:11";
        Date birthdayDate = sdf.parse(birthday);
        System.out.println("birthdayDate:"+birthdayDate);// Sat Oct 10 11:11:11 CST 1998

        System.out.println("==================================");
        // 注意事项:
        String strDate = "1999年10月10日 11:11:11";
        //Date date = sdf.parse(strDate);// 报解析异常ParseException 要解析的日期格式和日期格式化对象中指定的格式不一致

    }
}
小结:
SimpleDateFormat类: 继承DateFormat类
    概述:java.text.SimpleDateFormat 是日期/时间格式化类
    作用:可以将字符串类型的日期转换为Date类型的日期     String--->Date
        可以将Date类型的日期转换为字符串类型的日期     Date--->String
    构造方法:
        public SimpleDateFormat(String pattern): 创建日期格式化对象,通过参数指定日期格式
                   日期格式:
                       y   年
                       M   月
                       d   日
                       H   时
                       m   分
                       s   秒
                   常用的日期格式: yyyy-MM-dd HH:mm:ss  yyyy年MM月dd日 HH:mm:ss
  
    成员方法:
          - public String format(Date date):将Date对象格式化为字符串。 格式化
          - public Date parse(String source):将字符串解析为Date对象。  解析
           注意:要解析的日期格式和日期格式化对象中指定的格式要一致,否则报异常

实操–日期类练习

需求

  • 键盘输入一个字符串类型的时间,打印你来到世界多少天?

分析

  • 从控制台接收用户的生日——String类型,例如:“1998-03-18”
  • 计算生日距离标准基准时间的毫秒值
  • 计算现在时间距离标准基准时间的毫秒值
  • 计算出生的天数并打印(2个毫秒值相减—转换为天数)

讲解

public class Test {
    public static void main(String[] args) throws ParseException {
        // 需求: 键盘输入一个字符串类型的时间,打印你来到世界多少天?
        // 1.键盘录入一个字符串类型的时间
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个出生日期,格式yyyy-MM-dd: ");
        String birthdayStr = sc.next();

        // 2.创建日期格式化对象,指定日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        // 3.把字符串类型的时间转换为Date类型的时间
        Date birthdayDate = sdf.parse(birthdayStr);

        // 4.创建当前系统时间日期对象
        Date nowDate = new Date();

        // 5.获取当前系统时间日期对象距离标准基准时间的毫秒值
        long birthdayTime = birthdayDate.getTime();

        // 5.获取出生日期距离标准基准时间的毫秒值
        long nowTime = nowDate.getTime();

        // 6.计算2个毫秒值差,换算成天,打印输出
        System.out.println("来到世界"+((nowTime - birthdayTime) / 1000 / 60 / 60 / 24)+"天");
    }
}

知识点–Calendar类

目标:

  • Calendar类的概述以及常用方法

路径:

  • Calendar类的概述
  • Calendar类的常用方法

讲解:

Calendar类的概述

  • java.util.Calendar类表示一个“日历类”,可以进行日期运算。它是一个抽象类,不能创建对象,我们可以使用它的子类:java.util.GregorianCalendar类。

  • 有两种方式可以获取GregorianCalendar对象:

    • 直接创建GregorianCalendar对象;
    • 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象【本次课使用】
  • public static Calendar getInstance() 获取当前日期的日历对象

public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal);
        /*
            java.util.GregorianCalendar[time=1597117748394,areFieldsSet=true,areAllFieldsSet=true,
            lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,
            dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,
            minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=7,WEEK_OF_YEAR=33,WEEK_OF_MONTH=3,
            DAY_OF_MONTH=11,DAY_OF_YEAR=224,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=11,
            HOUR_OF_DAY=11,MINUTE=49,SECOND=8,MILLISECOND=394,ZONE_OFFSET=28800000,DST_OFFSET=0]

         */
    }

Calendar类的常用方法

  • public int get(int field) 获取某个字段的值。
    • 参数field:表示获取哪个字段的值,可以使用Calender中定义的常量来表示
    • Calendar.YEAR : 年
      Calendar.MONTH :月
      Calendar.DAY_OF_MONTH:月中的日期
      Calendar.HOUR:小时
      Calendar.MINUTE:分钟
      Calendar.SECOND:秒
      Calendar.DAY_OF_WEEK:星期
  • public void set(int field,int value) 设置某个字段的值
  • public void add(int field,int amount)为某个字段增加/减少指定的值
  • 额外扩展2个方法:
    • void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。
    • boolean before(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
      • 调用before方法的日历对象是否在参数时间对象之前,
        • 如果在之前就返回true 例如: 2017年11月11日 2019年12月18日 true
        • 如果不在之前就返回false 例如: 2019年12月18日 2017年11月11日 false
public class Test2_Calendar常用方法 {
    public static void main(String[] args) throws ParseException {
        /*
            Calendar常用方法:
                public int get(int field) 获取某个字段的值。
                    日历中的字段:
                        Calendar.YEAR  年
                        Calendar.MONTH  月
                        Calendar.DAY_OF_MONTH  日
                        Calendar.HOUR_OF_DAY  时
                        Calendar.MINUTE  分
                        Calendar.SECOND  秒
                        ....
                public void set(int field,int value) 设置某个字段的值
                public void add(int field,int amount)为某个字段增加/减少指定的值
                扩展:
                void setTime(Date date)  使用给定的 Date 设置此 Calendar 的时间。
                boolean before(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
                boolean after(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
         */
        // 获取当前时间的日历对象
        Calendar cal = Calendar.getInstance();

        // 获取日历对象中属性的值
        System.out.println(cal.get(Calendar.YEAR));// 2020
        System.out.println(cal.get(Calendar.MONTH));// 7
        System.out.println(cal.get(Calendar.DAY_OF_MONTH));// 11
        System.out.println(cal.get(Calendar.HOUR_OF_DAY));// 12

        // 设置某个字段的值
        // 把cal日历对象中的YEAR字段的值改为1999
        cal.set(Calendar.YEAR,1999);
        System.out.println(cal.get(Calendar.YEAR));// 1999

        // 对cal日历对象中的YEAR字段的值+1
        cal.add(Calendar.YEAR,1);
        System.out.println(cal.get(Calendar.YEAR));// 2000

        // 对cal日历对象中的YEAR字段的值-1
        cal.add(Calendar.YEAR,-1);
        System.out.println(cal.get(Calendar.YEAR));// 1999

        System.out.println("+=====================================");
        // 需求:获取1999-10-10对应的日历对象
        String birthday = "1999-10-10";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date birthdayDate = sdf.parse(birthday);

        // 获取日历对象
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(birthdayDate);
        System.out.println(cal1.get(Calendar.YEAR));// 1999
        System.out.println(cal1.get(Calendar.MONTH));// 9
        System.out.println(cal1.get(Calendar.DAY_OF_MONTH));// 10

        System.out.println("+=====================================");
        Calendar cal2 = Calendar.getInstance();

        // 判断出生日期对应的日历对象cal1是否在当前日历对象cal2之后
        System.out.println(cal1.after(cal2));// false;

        // 判断出生日期对应的日历对象cal1是否在当前日历对象cal2之前
        System.out.println(cal1.before(cal2));// true

    }
}

注意

  • 1.中国人:一个星期的第一天是星期一,外国人:一个星期的第一天是星期天
  • 2.日历对象中的月份是: 0-11

你可能感兴趣的:(java)