Java中的日期时间类详解(Date、DateFormat、Calendar)

1. Date类


1.1 概述


java.util.Date类表示特定的瞬间,精确到毫秒。Date类的构造函数可以把毫秒值转成日期对象。

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

1.2 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。

 利用空参构造可以自动设置当前系统时间的毫秒时刻

 //1.创建对象表示一个时间
        Date d1=new Date();
        System.out.println(d1);

 利用有参构造指定long类型的构造参数,可以自定义毫秒时刻。例如:

  //2.创建对象表示一个指定的时间
        Date d2=new Date(0L);
        System.out.println(d2);

利用setTime修改时间 
  • public void setTime(long time) 把方法参数给定的毫秒值设置给日期对象

//3.setTime修改时间
        //1000毫秒=1s
        d2.setTime(1000L);
        System.out.println(d2);

利用getTime获取时间 

  • public long getTime() 把日期对象转换成对应的时间毫秒值。

 //利用gettime获取时间
        long time = d2.getTime();
        System.out.println(time);

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

练习

public class timedemo2 {
    public static void main(String[] args) {
      //需求: 打印时间原点开始一年之后的时间
        Date d1 = new Date(0L);
        //获取d1时间的毫秒值
        long time = d1.getTime();
        //在这个基础上我们要加一年的毫秒值
        time+=1000L*60*60*24*365;
        //把计算之后的时间毫秒值再设置回d1当中
        d1.setTime(time);
        System.out.println(d1);
    }
}

 //需求2:定义2个任意的Date对象,比较一个哪个时间在前
        Date d1 = new Date(Math.abs(r.nextInt()));
        Date d2 = new Date(Math.abs(r.nextInt()));
        long time1 = d1.getTime();
        long time2 = d2.getTime();
        if (time1 > time2) {
            System.out.println("第一个时间在后面,第二个时间在前面");
        } else if (time1<time2) {
            System.out.println("第一个时间在前面,第二个时间在后面");

        }else{
            System.out.println("二个时间一样");
        }

    }

2. DateFormat类

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

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

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

2.1 构造方法

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

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

2.2 格式规则

常用的格式规则为:

format方法 

使用format方法的代码为:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
 把Date对象转换成String
*/
public class Demo03DateFormatMethod {
    public static void main(String[] args) {
        Date date = new Date();
        // 创建日期格式化对象,在获取格式化对象时可以指定风格
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        String str = df.format(date);
        System.out.println(str); // 2020年09月19日
    }
}

parse方法 

使用parse方法的代码为:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
 把String转换成Date对象
*/
public class Demo04DateFormatMethod {
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        String str = "2018年12月11日";
        Date date = df.parse(str);
        System.out.println(date); // Tue Dec 11 00:00:00 CST 2018
    }
}

package SimpleDateFormat;

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

public class SimpleDateFormatdemo1 {
    /*
   public simpleDateFormat() 默认格式
   public simpleDateFormat(String pattern) 指定格式
   public final string format(Date date) 格式化(日期对象 ->字符串)
   public Date parse(string source) 解析(字符串 ->日期对象)
       */
    public static void main(String[] args) throws ParseException {
        //method01();
        // method2();
        //1.定义一个字符串表示时间
        String str = "2023-11-11 11:11:11";
        //2.利用空参构造创建simpleDateFormat对象
        // 细节:
        //创建对象的格式要跟字符串的格式完全一致
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
        Date date = sdf.parse(str);
        //3.打印结果
        System.out.println(date);



    }

    private static void method2() {

        Date d2 = new Date();
        //2.利用带参构造创建simpleDateFormat对象,指定格式
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss EE");
        System.out.println(sdf2.format(d2));
    }

    private static void method01() {
        //1.利用空参构造创建simpleDateFormat对象,默认格式
        SimpleDateFormat sdf = new SimpleDateFormat();
        Date d1 = new Date();//当前系统时间
        System.out.println(sdf.format(d1));//打印格式化(日期对象 ->字符串)
        //2024/7/4 下午5:19
    }

}

练习1

package SimpleDateFormat;

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

public class SimpleDateFormatdemo2 {
     /*
   public simpleDateFormat() 默认格式
   public simpleDateFormat(String pattern) 指定格式
   public final string format(Date date) 格式化(日期对象 ->字符串)
   public Date parse(string source) 解析(字符串 ->日期对象)
       */
     public static void main(String[] args) throws ParseException {
         //1.定义一个字符串表示时间
         String str="2000-11-11";
         //2.利用空参构造创建simpleDateFormat对象
         // 细节:
         //创建对象的格式要跟字符串的格式完全一致
         SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");
         Date date = sdf1.parse(str);

         //利用带参构造创建simpleDateFormat对象,指定格式
         SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
         System.out.println(sdf2.format(date));
     }
}

练习2


 

package SimpleDateFormat;
/* 需求:
            秒杀活动开始时间:2023年11月11日 0:0:0(毫秒值)
            秒杀活动结束时间:2023年11月11日 0:10:0(毫秒值)

            小贾下单并付款的时间为:2023年11月11日 0:01:0
            小皮下单并付款的时间为:2023年11月11日 0:11:0
            用代码说明这两位同学有没有参加上秒杀活动?
         */

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

public class SimpleDateFormatdemo3 {
    public static void main(String[] args) throws ParseException {
        //1.定义字符串表示三个时间
        String startstr = "2023年11月11日 0:0:0";//600000毫秒=600s
        String endtstr = "2023年11月11日 0:10:0";
        String ordertstr = "2023年11月11日 0:01:0";//6s
        //2.解析上面的三个时间,得到Date对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date startdate = sdf.parse(startstr);
        Date enddate = sdf.parse(endtstr);
        Date orderdate = sdf.parse(ordertstr);
        //3.获取3个毫秒差
        long starttime = startdate.getTime();
        long endtime = enddate.getTime();
        long ordertime = orderdate.getTime();
       if (ordertime >=starttime&& ordertime <=endtime) {
           System.out.println("参加活动成功");
       }else {
           System.out.println("参加活动失败");
       }


    }
}

3.Calendar类

3.1 概念
java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。

3.2 获取方式
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:

Calendar静态方法

public static Calendar getInstance():使用默认时区和语言环境获得一个日历

import java.util.Calendar;

public class Demo06CalendarInit {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
    }    
}

3.3 常用方法
根据Calendar类的API文档,常用方法有:

public int get(int field):返回给定日历字段的值。
public void set(int field, int value):将给定的日历字段设置为给定值。
public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。

Calendar类中提供很多成员常量,代表给定的日历字段:

//1.获取日历对象
//细节1:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
//底层原理:
//会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
//把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
// 0 :纪元
// 1 :年
// 2 :月
// 3 : 一年中的第几周
// 4:一个月中的第几周
// 5: 一个月中的第几天(日期)
// ....
//细节2:
//月份:范围0~11 如果获取出来的是.那么实际上是1月。
//星期:在老外的眼里,星期日是一周中的第一天
//      1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

get/set方法

get方法用来获取指定字段的值,set方法用来设置指定字段的值,代码使用演示:

import java.util.Calendar;
public class Demo {
    public static void main(String[] args) {
        // 创建Calendar对象
        Calendar cal = Calendar.getInstance();
        // 获取年 
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
}

package Calendar;

import java.util.Calendar;

public class CalendarDemo3 {
    public static void main(String[] args) {
        Calendar cal=Calendar.getInstance();
        //设置年
        cal.set(Calendar.YEAR,2034);
        //获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH)+1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
}

add方法

add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量。代码如:

package Calendar;
import java.util.Calendar;
public class CalendarDemo4 {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        // 获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
        // 使用add方法
        cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
        cal.add(Calendar.YEAR, -3); // 减3年
        // 获取年
        year = cal.get(Calendar.YEAR);
        // 获取月
        month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
    }
}

getTime方法:返回对应的Date对象

Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。

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

public class Demo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Date date = cal.getTime();
        System.out.println(date); 
    }
}

综合

package Calendar;

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

import static Calendar.CalendarDemo1.getWeek;

/*
      public static Calendar lgetInstance()               获取当前时间的日历对象
      public final Date getTime()                         获取日期对象
      public final setTime(Date date)                     给日历设置日期对象
      public long getTimeInMillis()                       拿到时间毫秒值
      public void setTimeInMillis(long millis)            给日历设置时间毫秒值
      public int get(int field)                           获取日期中的某个字段信息
      public void set(int field,int value)                修改日历的某个字段信息
      public void add(int field,int amount)               为某个字段增加/减少指定的值
      */
public class CalendarDemo5 {
    public static void main(String[] args) {
        //1.获取日历对象
        //细节1:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
        //底层原理:
        //会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
        //把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
        // 0 :纪元
        // 1 :年
        // 2 :月
        // 3 : 一年中的第几周
        // 4:一个月中的第几周
        // 5: 一个月中的第几天(日期)
        // ....
        //细节2:
        //月份:范围0~11 如果获取出来的是.那么实际上是1月。
        //星期:在老外的眼里,星期日是一周中的第一天
        //      1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)
        Calendar c = Calendar.getInstance();
       /*
       public final Date getTime()                         获取日期对象
        public final setTime(Date date)                     给日历设置日期对象
        */
        //2.修改一下日历代表的时间
        Date d = new Date(0L);
        c.setTime(d);
        System.out.println(c);
        //puslic int get(int field) 取日期中的某个字段信息
        //public void set(int field,int value) 修改日历的某个字段信息

        c.set(Calendar.YEAR, 2024);
        c.set(Calendar.MONTH,7);
        c.set(Calendar.DAY_OF_MONTH,5);
        //增加一个月
        c.add(Calendar.MONTH, 1);
        //java在Calendar类中,把索引对应的数字都定义成常量
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int date = c.get(Calendar.DAY_OF_MONTH);
        int week = c.get(Calendar.DAY_OF_WEEK);
       //public void add(int fieldint amount) 为某个字段增加/减少指定的值

        System.out.println(year+" "+month+" "+date+" "+getWeek(week));

    }
    //查表法://表:容器
    //让数据跟索引产生对应的关系
    //传入对应的数字: 1 ~7//返回对应的星期
    public static String getWeek(int index) {
        //定义一个数组,让汉字星期几 跟1~7产生对应关系
        String[] arr = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        //根据索引返回对应的星期
        return arr[index];

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值