首先对时间的几个补充有必要知道:
时间起点:
心得:
如果以后我们仅仅要展示时间,那么可以用Date和SimpleDateFormat(格式化)
如果我们要拿着两个时间进行计算,用Date和SimpleDateFormat(解析)
如果我们要修改时间,可以使用Calendar简化开发。
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; } }
可知,空参构造,就是获取当前的时间值,如下:
发现Date空参构造打印的时间确实是现在目前的时间。
那有参构造是什么意思呢?
有参构造是在起始时间(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
Date类中的多数方法已经过时,常用的方法有:
public long getTime()
把日期对象转换成对应的时间毫秒值。
public void setTime(long time)
把方法参数给定的毫秒值设置给日期对象
示例代码
通过代码可知,getTime()是获得当前时间到起始时间的毫秒值。
且System.currentTimeMillis()也是返回起始时间到现在经历的毫秒值。这个在前一节我们就学过的,这里温习一下。
setTime()的功能就是设置偏移值,以毫秒为单位。以C语言生日为起始地址。
小结:Date表示特定的时间瞬间,我们可以使用Date对象对时间进行操作。
需求:
请打印:当前时间往后走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用于日期格式化,他的父类:java.text.DateFormat
是日期/时间格式化的抽象类,我们通过SimpleDateFormat类可以帮我们完成日期和文本之间的转换,也就是可以在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 { //格式化:从 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); } }
运行结果:
有必要注意的是对月份格式化时得用大写的MM,而不是小写的mm,小写mm是对分钟进行格式化。这是要注意的一个点,其次下面这个语句
Date dd = sdf2.parse(ss);
这条语句在写的时候会有错误,按住alt+回车,选择第一个添加异常,后面会学。
添加以后是这样:
小结:DateFormat可以将Date对象和字符串相互转换。
需求:
将当前的时间按照以下格式打印: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());
需求:
肯打鸡品牌有一个秒杀活动:
活动开始时间为: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秒格式
代码如下:
得先把之前的格式解析为date对象,然后再将此date对象按照指定格式打印。这个小练习还是有点综合哦。多多练习。