JavaSE学习进阶day04_01 Date类

第一章 Date类

首先对时间的几个补充有必要知道:

JavaSE学习进阶day04_01 Date类_第1张图片

时间起点:

JavaSE学习进阶day04_01 Date类_第2张图片

心得:

如果以后我们仅仅要展示时间,那么可以用Date和SimpleDateFormat(格式化)

如果我们要拿着两个时间进行计算,用Date和SimpleDateFormat(解析)

如果我们要修改时间,可以使用Calendar简化开发。

1.1 Date概述

Date其实是JDK提供的Javabean类,用来描述时间的。

如果我们自己去编写一个描述时间的类,那么按照习惯,肯定要思考有什么属性,空参构造,带参构造还有对应的get和set方法,toString方法。看看Date类的几个重要成员和方法。

class Date{
    //属性
    //毫秒值(从计算机的时间原点开始,到指定时间的毫秒值)
    long fastTime;
    
    //如果是空参,我们要给fastTime赋一个默认值
    //默认使用系统当前时间会更方便。
    public Date(){
        fastTime = System.currentTimeMillis();
    }
    
    //传递的是0,表示Date对象,记录的就是时间原点的那个时间。
     public Date(long time){
        this.fastTime = time;
    }
    
    //修改了当前Date对象记录的毫秒值。
    public void setTime(long time){
        this.fastTime = time;
    }
    
    public long getTime(){
        return fastTime;
    }
    
}

可知,空参构造,就是获取当前的时间值,如下:

JavaSE学习进阶day04_01 Date类_第3张图片

发现Date空参构造打印的时间确实是现在目前的时间

那有参构造是什么意思呢?

JavaSE学习进阶day04_01 Date类_第4张图片

有参构造是在起始时间(C语言诞生时间)的基础上加一个值,单位为毫秒。打印的是加上该值的时间

java.util.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) {
        // 创建日期对象,把当前的时间
        System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020
        // 创建日期对象,把当前的毫秒值转成日期对象
        System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
    }
}

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

注意:在创建有参构造时,当实参是一个表达式值时,表达式的每一个部分都要写成long类型,因为不这样可能出错。例如实参3600L*24L*365L,而不是写成3600*24*365,写成这样不严谨。因为毫米很大,有时候会超过int型范围,会出错,因此每个部分都要加上L

1.2 Date常用方法

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

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

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

示例代码

JavaSE学习进阶day04_01 Date类_第5张图片

通过代码可知,getTime()是获得当前时间到起始时间的毫秒值

System.currentTimeMillis()也是返回起始时间到现在经历的毫秒值。这个在前一节我们就学过的,这里温习一下。

setTime()的功能就是设置偏移值以毫秒为单位。以C语言生日为起始地址

小结:Date表示特定的时间瞬间,我们可以使用Date对象对时间进行操作。

1.3练习:当前时间加1小时

需求:

请打印:当前时间往后走1小时的时间

代码示例:

//1.创建一个Date对象,表示当前时间
Date d = new Date();
//2.获取当前时间毫秒值
long time = d.getTime();
//3.往后走1小时
//此时time计算完毕之后,表示的就是当前时间之后,1小时的时间毫秒值
time = time + 3600 * 1000;
//4.再设置回去
d.setTime(time);
//5.打印时间
System.out.println(d);

第二章 SimpleDateFormat类

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

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

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

2.1 构造方法

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

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

2.2 格式规则

常用的格式规则为:

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

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

2.3 常用方法

DateFormat类的常用方法有:

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

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

public class SimpleDateFormatDemo {
    public static void main(String[] args) throws ParseException {
        //格式化:从 Date 到 String
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(d);
        System.out.println(s);
        System.out.println("--------");
​
        //从 String 到 Date
        String ss = "2048-08-09 11:11:11";
        //ParseException
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dd = sdf2.parse(ss);
        System.out.println(dd);
    }
}

运行结果:

JavaSE学习进阶day04_01 Date类_第6张图片

有必要注意的是对月份格式化时得用大写的MM,而不是小写的mm,小写mm是对分钟进行格式化。这是要注意的一个点,其次下面这个语句

Date dd = sdf2.parse(ss);

这条语句在写的时候会有错误,按住alt+回车,选择第一个添加异常,后面会学。

JavaSE学习进阶day04_01 Date类_第7张图片

添加以后是这样:

JavaSE学习进阶day04_01 Date类_第8张图片

小结:DateFormat可以将Date对象和字符串相互转换。

2.4练习:格式化时间

需求:

将当前的时间按照以下格式打印:XXXX年XX月XX日 XX:XX:XX

代码示例:

//创建对象,指定对应的模式
//如果空参构造,那么采取默认的模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
​
//创建Date对象,表示当前时间
Date d = new Date();
//把当前时间格式化成指定的模式
String result = sdf.format(d);
//System.out.println(result);
​
​
Date date = sdf.parse("2021年11月11日 11:11:11");
System.out.println(date.getTime());

运行结果:

JavaSE学习进阶day04_01 Date类_第9张图片

2.5练习:秒杀活动

需求:

肯打鸡品牌有一个秒杀活动:

活动开始时间为:2020年11月11日 0:0:0

活动结束时间为:2020年11月11日 0:10:0

现在,有两名同学参加了活动,小贾下单并付款的时间为:2020年11月11日 0:03:47。

小皮下单并付款的时间为:2020年11月11日 0:10:11

要求:

用代码说明这两位同学有没有参加上秒杀活动?

分析:

  • 判断下单时间是否在开始到结束的范围内。

  • 把字符串形式的时间变成毫秒值。

代码示例:

//1.创建日期格式化对象,并指定对应的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//2.计算活动开始时间的毫秒值
String start = "2020年11月11日 0:0:0";//定义字符串表示活动开始时间
Date startDate = sdf.parse(start);//把字符串解析成Date对象
long startTime = startDate.getTime();//获取Date对象中的时间毫秒值
//3.计算活动结束时间的毫秒值
String end = "2020年11月11日 0:10:0";
Date endDate = sdf.parse(end);
long endTime = endDate.getTime();
//4.计算小贾同学下单时间的毫秒值
String user = "2020年11月11日 0:03:47";
Date userDate = sdf.parse(user);
long userTime = userDate.getTime();
//5.判断userTime是否在活动时间之内即可
if(userTime >= startTime && userTime <= endTime){
    System.out.println("参加活动成功");
}else{
    System.out.println("参加活动失败");
}

再看一个综合练习,一定要掌握这个练习:

将2048-08-09 11:11:11打印成2048年08月09号 11点11分11秒格式

代码如下:

JavaSE学习进阶day04_01 Date类_第10张图片

得先把之前的格式解析为date对象,然后再将此date对象按照指定格式打印。这个小练习还是有点综合哦。多多练习。

你可能感兴趣的:(Java学习,学习,java,前端)