从零开始学Java-JDK7时间类:Data

105 阅读12分钟

目录

  • Date:时间
  • SipmleDateFormat:格式化时间
  • Calendar:日历对象

Date

在学习之前我们先来做个知识扩展吧:

  • 世界标准时间:

    • 格林尼治时间/格林威治时间(Greenwich MeanTime)简称 GMT,目前世界标准时间(UTC)已经替换为:原子钟
  • 时间单位换算:

    • 1秒1000毫秒
    • 1毫秒1000微秒
    • 1微秒1000纳秒
  • Date类

    • Date类是一个JDK写好的Javabean类,用来描述时间,精确到秒。
    • 利用空参构造创建的对象,默认表示系统当前时间。
    • 利用有参构造创建的对象,表示指定的时间。

构造方法

构造方法说明
public Date()构造一个Date,使用默认格式
public Date(long time)构造一个Date,使用指定的格式

下面我们来实操一下吧:

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

image.png

  • 创建对象表示一个指定的时间
//2.创建对象表示一个指定的时间
Date d2 =new Date(0L); // 0秒就表示从时间原点过去了多少秒
System.out.println(d2);

image.png

  • setTime 修改时间
// 3.setTime 修改时间
d2.setTime(1000L);
System.out.println(d2);

image.png

怎么样,是不是成功修改了1秒呀。

  • getTime获取当前时间的毫秒值
// 4.getTime获取当前时间的毫秒值
long time =d2.getTime();
System.out.println(time);

image.png

时间1000毫秒就等于1秒,所以会打印一个1000出来。

下面我们大概了解了,那接下来做两个小小练习练一下吧:

  • 需求一:打印时间原点开始一年之后的时间
  1. 创建一个对象,表示时间原点
Date d1 = new Date(0L);

2. 取d1时间的毫秒值

long time = d1.getTime();

3. 在这个基础上我们要加一年的毫秒值即可

time = time + 1000L * 60 * 60 * 24 * 365;

4. 把计算之后的时间毫秒值,再设置回d1当中

d1.setTime(time);

5. 打印

System.out.println(d1);

下面我们来运行看一下:

image.png

可以看到打印出了1971年1月1日 8:00,是不是过去了一年的时间呀!我们再来看第二个!

  • 需求二:定义任意两个Date对象,比较一下哪个时间在前,哪个在后
  1. 利用随机生成两个时间
Random r = new Random();
Date d1 = new Date(Math.abs(r.nextInt()));
Date d2 = new Date(Math.abs(r.nextInt()));

2. 获取毫秒值

long time1 = d1.getTime();
long time2 = d2.getTime();

3. 比较

if(time1 > time2){
    System.out.println("第一个时间在后面,第二个时间在前面");
}else if(time1< time2){
    System.out.println("第二个时间在后面,第一个时间在前面");
}else{
    System.out.println("表示两个时间一样");
}

我们来看一下:

image.png

时间比较是不是通过毫秒来比较的呀,下面我们就会来学习怎么样转为真正的时间进行比较了。

  • 下面我们来做个总结吧:

    • 如何创建日期对象?
      • Date date=new Date();

      • Date date =new Date(指定毫秒值);

    • 如何修改时间对象中的毫秒值
      • setTime(毫秒值):
    • 如何获取时间对象中的毫秒值
      • gettime();

SipmleDateFormat

  • SimpleDateFormat 类作用
    • 格式化:把时间变成我们喜欢的格式。
    • 解析:把字符串表示的时间变成Date对象。

我们之前打印的时间是不是都是这种格式呢: image.png

这种打印是不是,不太好看呢,那下面我们就来学习SimpleDateFormat的格式化,变成我们想要的样子吧:

image.png

先来了解一下他的构造方法和成员方法吧:

构造方法

构造方法说明
public simpleDateFormat()构造一个SimpleDateFormat,使用默认格式
public simpleDateFormat(string pattern)构造-个simpleDateFormat,使用指定的格式

我们来实操一下看看:

利用空参构造创建对象

SimpleDateFormat sdf1 = new SimpleDateFormat();
Date d1 = new Date(0L);
String str1 = sdf1.format(d1);
System.out.println(str1);

这个时候我们来运行看一下:

image.png

怎么样,是不是把时间原点用另外一种格式打印出来了呀,对比上面的那种打印应该这种更易懂吧!接着看:

利用带参构造创建对象

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

来运行看一下:

image.png

怎么样,是不是把年月日都给加上去打印出来了呀,那我想要打印星期几怎么打印呢?其实也是只需要在后面拼接周的字母E就可以了哟:

SimpleDateFormat sdf2 = new SimpleDateFormat( "yyyy年MM月dd日 HH:mm:ss EE");

我们来看一下:

image.png

到这里我们就学习完毕构造方法啦,下面我们来看一下成员方法吧:

成员方法

构造方法说明
public final string format(Date date)格式化(日期对象->字符串)
public Date parse(string source)解析(字符串->日期对象)

来实操一下看看带给我们的乐趣:

parse(string source) 解析(字符串->日期对象)

//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);
System.out.println(date);

这里我们运行看一下:

image.png

是不是已经把date时间解析出来了呀,然后就可以调用里面的getTime方法获取出当前时间的毫秒值:

System.out.println(date.getTime());

image.png

是不是也一样解析出时间的毫秒值了呀。有了毫秒值之后就可以拿他来进行加减判断啦。

  • 这边有个小细节:创建对象的格式要跟字符串的格式完全一致

到这里就学完啦,下面我们还是来做两个小小的练习题吧:

  • 需求一:假设,你初恋的出生年月日为:2000-11-11,请用字符串表示这个数据,并将其转换为:2000年11月11日
  1. 定义一个字符串表示时间
String str="2000-11-11";

2. 解析字符串

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf1.parse(str);

3. 格式化输出

SimpleDateFormat sdf2 = new SimpleDateFormat( "yyyy年MM月dd日");
String result= sdf2.format(date);
System.out.println(result);

我们来运行看一下:

image.png

是不是和需求的时间格式一模一样呀,我们接着看下一个吧!

  • 需求二:某活动秒杀开始开始时间:2023年11月11日 0:00:00,结束时间:2023年11月11日 0:10:00。张三下单并付款的时间为:2023年11月11日 0:05:58,用代码说明张三有没有参与上秒杀活动。
  1. 定义三个字符串表示开始时间和结束时间以及下单时间
String startStr = "2023年11月11日 0:00:00";
String endStr = "2023年11月11日 0:10:00";
String orderStr = "2023年11月11日 0:05:58";

2. 解析三个字符串时间得到Date对象

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date startDate = sdf.parse(startStr);
Date endDate = sdf.parse(endStr);
Date orderDate = sdf.parse(orderStr);

3. 得到三个毫秒值

long startTime = startDate.getTime();
long endTime = endDate.getTime();
long orderTime = orderDate.getTime();

4. 判断

if (orderTime >= startTime && orderTime <= endTime) {
    System.out.println("参加秒杀活动成功");
} else {
    System.out.println("参加秒杀活动失败");
}

我们来运行看一下吧:

image.png

在开始和结束这段时间内下单的是不是都参与成功了呀,到这里SipmleDateFormat就学完啦,我们接着往下看!

Calendar

我们前面学习了Date和SipmleDateFormat方法,而这个Calendar是干什么的呢?我们来看一个需求:

需求:将2023年11月11日增加一个月变成2023年12月11日。

我们以前的写法是不是要先定义字符串表示2023年11月11日。解析字符串得到Date对象。获取2023年11月11日的毫秒值。增加一个月的毫秒值:100060602430.在格式化时间变成2023年12月11日。那这样写也太麻烦了呀,有没有一种更简单的方法呢?其实是有的,Calendar的作用是表示相同当前时间的日历对象,可以单独修改年月日。

Calendar概述

Calendar代表了系统当前时间的日历对象,可以单独修改、获取时间中的年、月、日。

细节:Calendar是一个抽象类,不能直接创建对象。

获取Calendar对象方法

方法名说明
public static Calendar getInstance()获取当前时间的日历对象

我们来实操一下看看:

// 1.获取口历对象
// 细节:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
Calendar c=Calendar.getInstance();
System.out.println(c);

我们来运行看一下:

image.png

是不是就直接把我们当前系统的日期给获取出来了呀。但是目前是12月份,为什么打印出来的是11月份呢?我们来了解一下他的底层原理吧:

  1. 会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
  2. 把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
  3. 月份:范围0-11,如果获取出来的是0,那么实际上是1月份。
  4. 星期:在老外眼里,星期日是一周的第一天,所以会从星期日开始计算
  5. 1.星期日 2.星期一 3.星期二 4.星期三 5.星期四 6.星期五 7.星期六

成员方法

方法名说明
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)为某个字段增加/减少指定的值

下面我们也来实操一下吧:

// 修改一下日历代表的时间
Date d = new Date(0L);
c.setTime(d);
System.out.println(c);

我们下面来看后面三个吧:

取日历中的年月日字段信息

我们可以看到他给我们返回的是一个数组,那对应的下标分别表示什么呢?我们来看一下:

0:纪元 1:年 2:月 3:一年中的第几周 4:一个月中的第几周 5:一个月中的第几天(日期)

我们既然是要取年月日,那是不是获取到对应的1,2,5就可以啦。我们来试一下:

Calendar c = Calendar.getInstance();
int year = c.get(1);
int month = c.get(2);
int date = c.get(5);

image.png

他为什么打印出来的是11月份呢?刚才是不是说了月份的范围是0到11呀,打印出来的如果是0,其实是一月份,所以说要在月份获取出来的基础上+1,那这个才是真实的月份。

int month = c.get(2) + 1;

image.png

下面我们来说个小细节:Java在Calendar类中,把索引对应的数字都定义成了常量。 虽然写数字也没错,但是不美观,所以我们可以去看一下他的常量有哪些:

image.png

是不是都是一一对应的呀,下面我们来改一下把:

Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);

到这里就直接获取到了年月日的信息。那我还想获取星期几怎么办呢?其实也是一样的呢:

int week = c.get(Calendar.DAY_OF_WEEK);

image.png

我们来看一下,他返回了一个3,但是今天是星期二呀,我们前面是不是说了老外是从星期日开始计算的呀,3对应的其实就是星期二哟。那我想要他输出的信息和中文的一样怎么办呢?其实我们可以定义一个查表法来获取定义的星期哟:

定义查表法,让数据跟索引产生定义的关系:

public static String getweek(int index){
    // 1。定义一个数组让汉字星期几跟1-7产生对应的关系
    String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    // 2.根据索引返回对应的星期
    return arr[index];
}

我们也来改一下输出的那里,调用一个getweek方法:

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

这个时候来看一下:

image.png

怎么样,是不是就一样了呀!既然我们获取到了想要的字段,那下面我们就可以单独拿某一个字段进行修改啦。

修改某字段信息

需求:将年改成2025年,月改成6月分,日改为18日。

// 修改日历的某个字段信息
c.set(Calendar.YEAR,2025);
c.set(Calendar.MONTH,5);
c.set(Calendar.DATE,18);

我们来运行看一下:

image.png

怎么样,是不是成功对某个字段进行修改了呀。

为某字段增加/减少值

需求:将上面信息2025年6月18日单独增加二个月。

// 为某个字段增加/减少指定的值
c.add(Calendar.MONTH,2);

image.png

是不是增加了2个月呀,那这里我传入一个负数看一下:

c.add(Calendar.MONTH,-2);

image.png

他的时间是不是就往前减了一个月呀,所以这个细节我们需要掌握。

下面我们来总结一下吧:

  • Calendar:表示一个时间的日历对象。
  • 如何获取对象:通过getInstance方法获取对象
  • 常用方法:setXxx:修改,getXxx:获取,add:增加或者减少
  • 细节点:日历类月份范围0-11,星期的特点:星期日是一周的第一天

好啦,到这里JDK7以前的时间日期相关类就学习完毕啦,有什么不懂的可以评论区一起互相探讨,我们下期不见不散!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==