0
点赞
收藏
分享

微信扫一扫

day18_Java中与时间相关的类

才德的女子 2022-03-26 阅读 76
java

在java中,万物皆对象。时间也是一个对象。下面我们来学习一下相关的API

JDK1.8之前的日期时间API,如下所示

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 Test {
    public static void main(String[] args) {
        // 创建当前统时间对应的日期对象
        Date date1 = new Date();
        System.out.println(date1);// Wed Mar 23 14:38:54 CST 2022

        // 创建以标准基准时间为基准 指定偏移1000毫秒
        Date date2 = new Date(1000);
        System.out.println(date2);// Thu Jan 01 08:00:01 CST 1970

        // 创建日期对象,表示1970年1月1日07:59:59
        Date date3 = new Date(-1000);
        System.out.println(date3);// Thu Jan 01 07:59:59 CST 1970
    }

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

  • public long getTime() :获取当前日期对象距离标准基准时间的毫秒值。
  • public void setTime(long time) :设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
   // 创建当前统时间对应的日期对象
        Date date = new Date();
        System.out.println(date);// Wed Mar 23 14:38:54 CST 2022

        //getTime() :获取当前日期对象距离标准基准时间的毫秒值。
        long time = date.getTime();
        System.out.println("从标准时间到现在过了:" + time+" 毫秒");// 从标准时间到现在过了:1648018667622 毫秒

        //setTime(long time) :设置当前日期对象距离标准基准时间的毫秒值.也就意味着改变了当前日期对象
        date.setTime(1000);
        System.out.println(date); //Thu Jan 01 08:00:01 CST 1970
  • public boolean after(Date when) :   测试此日期对象是否在参数日期对象之后。
  • public boolean before(Date when) :测试此日期对象是否在参数日期对象之前。
       // 创建当前统时间对应的日期对象
        Date date1 = new Date();

       // 创建以标准基准时间为基准 指定偏移1000毫秒
        Date date2 = new Date(1000L);
        System.out.println("date2表示的日期是否在date1之前:"+date2.before(date1));//  true
        System.out.println("date2表示的日期是否在date1之后:"+date2.after(date1));//   false

DateFormat类

概述:

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

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

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

构造方法为:

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

常用的格式规则为:

常见的日期格式:

  • yyyy年MM月dd日 HH时mm分ss秒
  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd
  • HH:mm:ss

DateFormat类的常用方法有:

  • public String format(Date date):将Date对象格式化为字符串。
  • public Date parse(String source):将字符串解析为Date对象。
  • import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Test {
        public static void main(String[] args) throws ParseException {
            // 创建日期格式化对象,并且指定日期格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
    
            //创建data对象
            Date date = new Date();
    
            // 格式化: 使用日期格式化对象,把日期对象转换为String对象
            String format = sdf.format(date);
            System.out.println(format);//2022年03月23日 16时08分31秒
    
            // 创建字符串对象
            String str = "2020年02月09日 02时00分00秒";
            // .解析:把String类型的对象转换为Date类型
            Date parse = sdf.parse(str);
            System.out.println(parse);//Sun Feb 09 02:00:00 CST 2020
        }
    }

Calendar类

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

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

  • 直接创建GregorianCalendar对象;
  • 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象

代码示例

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test {
    public static void main(String[] args) {
        //直接创建GregorianCalendar对象;
        GregorianCalendar calendar = new GregorianCalendar();
    
        // 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象
        Calendar cal = Calendar.getInstance();
    }
}

Calendar类的常用方法

  • public int get(int field) :获取某个字段的值。 参数field:表示获取哪个字段的值,可以使用Calender中定义的常量来表示
  • public void set(int field,int value):设置某个字段的值
  • public void add(int field,int amount):为某个字段增加/减少指定的值
import java.util.Calendar;

public class Test {
    public static void main(String[] args) {

        // 通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象
        Calendar cal = Calendar.getInstance();
        /*
             get(int field) :获取某个字段的值。
            参数field:表示获取哪个字段的值,可以使用Calender中定义的常量来表示
                        Calendar.YEAR : 年
                        Calendar.MONTH :月
                        Calendar.DAY_OF_MONTH:月中的日期
                        Calendar.HOUR:小时
                        Calendar.MINUTE:分钟
                        Calendar.SECOND:秒
                        Calendar.DAY_OF_WEEK:星期
         */
        //获取当前日历对象的年份
        System.out.println(cal.get(Calendar.YEAR)); // 2022

        //set(int field,int value):设置某个字段的值
        //设置年份为2088年
        cal.set(Calendar.YEAR, 2088);
        System.out.println(cal.get(Calendar.YEAR)); // 2088

        // add(int field,int amount):为某个字段增加/减少指定的值
        // 给年份增加2年
        cal.add(Calendar.YEAR, 2);
        System.out.println(cal.get(Calendar.YEAR)); // 2090
    }
}
  • public void setTime(Date date) : 使用给定的 Date 设置此 Calendar 的时间。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
// 需求: 获取1998年10月10日对应的日历对象
public class Demo {
    public static void main(String[] args) throws ParseException {

        // 创建当前时间的日历对象
        Calendar cal1 = Calendar.getInstance();

        String birthdayStr = "1998年10月10日";

        // 把字符串的日期转换为Date类型的日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date birthdayDate = sdf.parse(birthdayStr);

        // 调用cal的setTime方法,把日期对象传入
        cal1.setTime(birthdayDate);

        System.out.println(cal1.get(Calendar.YEAR));// 1998
        System.out.println((cal1.get(Calendar.MONTH)+1));// 10
        System.out.println(cal1.get(Calendar.DAY_OF_MONTH));// 10
    }
}
  • boolean before(Object when) :判断当前日历对象的时间是否在指定日历对象时间之前
  • boolean after(Object when): 判断当前日历对象的时间是否在指定日历对象时间之后
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
public class Demo {
    public static void main(String[] args) throws ParseException {

        // 创建当前时间的日历对象
        Calendar c1 = Calendar.getInstance();

        Date date = new Date(0L);
        // 创建当前时间的日历对象
        Calendar c2 = Calendar.getInstance();
        //设置成为时间原点的日历对象
        c2.setTime(date);

        //判断c1日历对象的时间是否在c2日历对象时间之前
        System.out.println(c1.before(c2));// false
        //判断c1日历对象的时间是否在c2日历对象时间之后
        System.out.println(c1.after(c2)); //true

    }
}

JDK1.8之后的时间类

Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

  • 可变性:象日期和时间这样的类对象应该是不可变的。Calendar类中可以使用三种方法更改日历字段:set()、add() 和 roll()。
  • 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的,不能处理闰秒等。

可以说,对日期和时间的操作一直是Java程序员最痛苦的地方之一。第三次引入的API是成功的,并且java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。

未完待续

举报

相关推荐

0 条评论