java中有一种特殊的对象,我们平时都是通过字符串的形式使用它,但在底层却时不时涉及到一些数字运算;除此之外,我们对它的字符串输出形式,往往还是百般挑剔,猜猜它是谁?
:-)没错,它就是java中的Date对象
java API
下为我们封装了有关时间和日期操作了相关函数,总结如下:
Date类 – 日期获取的好帮手
首先,学习一个类,大致分为以下几个步骤:
- 看类所在
package
,如果在java.lang
包下,则使用时可以省去导包操作。 - 接着看类的说明,了解类的大致用途即可。
- 查看类的构造函数
- 查看类的常用成员方法
好,我们按照上述步骤,来学习一下Date
。
所在package
由package java.util;
可知,Date
包位于java.util
包下,所有使用时需要导包。
类的介绍
查看源码注释
1 | /** |
首先,它告诉我们:Date
是用来表示一个以毫秒为单位的确定时刻的类。Date
可以表征“年”、“月”、“日”、“时”、“分”和“秒”。
构造方法
由于一些方法已经过时,这里我们只提及两个常用的构造方法。
1 | /** |
空参构造方法Date()
用来初始化一个Date
对象,其时间基准线为jvm
运行环境的当前时间,也就是说这个Date
对象的时间值与当前时间一致。
有参构造方法Date(long date)
用来初始化一个相对时间基准线,时间值为long date
的Date
对象。其中,时间基准线为1970-1-1 00:00:00
,俗称“计算机元年”。举个例子,Date(1000)
代表的是1970-1-1 00:00:01
这个时刻。
常用成员方法
这里我们介绍两个常用成员函数setTime()
和getTime()
:
1 | /** |
其中setTime(long time)
用来设置时间,参数time
为相对于“1970-1-1 00:00:00”的时间值,单位为毫秒。
而getTime()
代表的是当前时间的毫秒值,同样是相对于“1970-1-1 00:00:00”。
SimpleDateFormat类 – 日期格式化&解析神器
所在包
SimpleDateFormat
位于包java.text
下,使用前需要导包。
类概述
1 | /** |
大意是说:SimpleDateFormat
是一个用来格式化Date
(输入为Date
,输出为String
),以及解析Date字符串(输入为String
,输出为Date
)的具体类。SimpleDateFormat
特色是支持用户自定义格式,格式化Date
。
构造方法
这里我们主要讲解两个常用构造方法,分别是:空参构造方法SimpleDateFormat()
,以及有参构造方法SimpleDateFormat(String)
。
下面是它们的jdk源码:
1 | /** |
其中,空参构造方法SimpleDateFormat()
是以默认格式Sun Apr 28 20:45:54 CST 2019
构造SimpleDateFormat
对象,在之后的format
过程中,会以这个格式来生成对应的字符串。
而有参构造方法SimpleDateFormat(String)
,则是用给定的格式(如:yyyy:MM:dd HH:mm:ss)来生成对应SimpleDateFormat
对象,在之后的format
过程中,会以这个格式来生成对应的字符串。
常用成员方法
这里要注意一下,我们一般不怎么使用SimpleDateFormat
自己特有的成员方法;相反,我们比较爱用其继承于父类DateFormat
的方法formate(Date)
和parse(String)
。
相关源码如下:
1 | /** |
从以上代码可知,方法format
主要完成了Date
对象到指定格式字符串的转换;而parse
方法主要完成了String
对象到Date
对象的转化。
Calendar类 – 日期操作的手术刀
所在包
位于java.util
包下,使用前需执行导包操作。
类简述
见看一段jdk英文注解:
1 | /** |
翻译过来,大致意思就是:Calendar
是一个在“年”、“月”、“日”、“时”等日历属性,以及时间点(以毫秒为单位)之间进行转化的一个工具类。它可以对“年”、“月”、“日”、“时”等日历属性进行相关算术运算,最终反应在Date
中的就是属性值fastTime
的变化(即毫秒值的变化)。
构造方法
Calendar
构造函数有两个,分别为Calendar()
以及Calendar(TimeZone zone, Locale aLocale)
,但平时使用中我们基本不用。
实例化Calendar
类,我们一般选择使用ta的静态成员方法getInstance()
,实例化的是其子类对象。原因是:我们使用的某些成员方法如add(int, int)
,它的实现是在Calendar
的子类中完成的,这里用到了多态的向上转型。相应源码如下:
1 | /** |
需要注意的是:通过getInstance()
方法获取的Calendar
子类对象,其时间值是相对“计算机元年”而言的。
常用成员方法
这里,我们主要讲解“查询”、“设置”、“修改”calendar
指定字段(filed
)的成员方法。它们分别对应为:get(int)
方法、set(int,int)
方法、add(int,int)
方法。
1 | /** |
先说get(int)
方法,这个方法主要通过指定int
型字段来获取相应字段的整数型值。例如,get(Calendar.YEAR)
返回的就是当前系统的年份值。
常用的字段总结如下:
字段名 | 含义 |
---|---|
YEAR | 年份 |
MONTH | 月份 |
DAY_OF_MONTH | 月份中的日子 |
HOUR_OF_DAY | 一天中的小时 |
MINUTE | 小时中的分钟 |
SECOND | 分钟中的秒 |
接着谈谈set(int field, int value)
方法,这个方法是给指定字段设置给定值。例如,我们可以将月份设置为一月,即set(Calendar.MONTH, Calendar.JANUARY)
或者set(Calendar.MONTH, 0)
(因为这里采用的是格里高利纪年法,0表示一月)。
最后轮到add(int field, int amount)
了,这个方法和set(int ,int )
方法的区别有点类似“绝对路径”和“相对路径”的关系。add
方法更加偏向于通过运算(相对与当前字段而言)来更改字段值。举个栗子:如果当前月份是二月,我们向将其改为三月,可以这样add(Calendar.MONTH, 1)
;如果我们想将其改为一月,可以这样add(Calendar.MONTH, -1)
。