Java中对于时间类型的描述,都是基于从时间原点至当前代码执行瞬间所经过的毫秒数,本质上都是一个long型的数据。
1. java.util.Date
体现时间和日期的基本的类
规则:
- 年:
实际年份数字-1900
- 月:
0-11 表示 1月-12月
- 日:
1-31 表示 1日-31日
- 小时:
0-23 表示 0时-23时
- 分钟:
0-59 表示 0分-59分
- 秒:
0-59 表示 0-59秒
1.1 构造方法
- Date()
构建一个表示当前瞬间的时间对象
- Date(long date)
根据毫秒数构建一个表示时间原点经过毫秒数后的事件对象
//当前时间
Date d1 = new Date();
System.out.println(d1);
//构造特定时间
Date d2 = new Date(1000);
System.out.println(d2);
Date d3 = new Date(-1000);
System.out.println(d3);
1.2 API方法
- before(Date when)和after(Date when)
返回值boolean
判断参数when是否比当前日期对象早(before)或晚(after)
Date d2 = new Date(1000);
System.out.println(d2);
Date d3 = new Date(-1000);
System.out.println(d3);
Date d4 = new Date(1000);
System.out.println(d3);
boolean b1 = d2.before(d3);
System.out.println(b1);
boolean b2 = d2.after(d3);
System.out.println(b2);
boolean b3 = d2.before(d4);
System.out.println(b3);
结果
- compareTo(Date anotherDate)
返回值:int
int i1 = d2.compareTo(d3);//d2晚于d3
int i2 = d3.compareTo(d2);//d3早于d2
int i3 = d2.compareTo(d4);//d2和d3相等
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
运行结果
-
equals(Date anotherDate)
返回值boolean
源码:
比较的是两个时间的毫秒数,实际上比较的两个对象是否表示的是同一个时间 getTime()
返回值long
获得当前日期对象表示时间的毫秒数。
Date d = new Date();
long l = d.getTime();
- setTime(long mills)
返回值void
利用参数mills设置时间对象表示的时间
2. java.sql.Date和java.sql.Time
他们都是java.util.Date的子类
将数据库中的日期类型数据取出后
在Java中的体现就是java.sql.Date类的一个对象。在Java中它大多数表示的是精确到“年-月-日”时间
在Java中的体现就是java.sql.Time类的一个对象。在Java中它大多数表示的是精确到“时-分-秒”时间
3. java.sql.Timestamp
他是java.util.Date的子类
被称为“时间戳”,精确到非常高,通常用它表示数据库中时间数据。
一般表示精确度是“年-月-日 时-分-秒”
4. java.util.Calendar
Calendar类被称为“日历类”,提供了大量的静态常量属性和API方法对日期和时间进行操作。单纯操作时间,建议使用Calendar类来完成时间构建和赋值操作。
API方法
4.1.1 static getInstance()返回值:Calendar
构建一个表示当前瞬间的日历类对象
Calendar cal = Calendar.getInstance();
4.1.2 get(int field)返回值:int
根据输入filed的值,取得对应日历上的数据
Calendar cal = Calendar.getInstance();
System.out.println(cal);
int year = cal.get(Calendar.YEAR); //取得年份
int month = cal.get(Calendar.MONTH)+1; //取得月
int day = cal.get(Calendar.DAY_OF_MONTH); //取得日
int hour = cal.get(Calendar.HOUR); //取得时
int minute = cal.get(Calendar.MINUTE); //取得分
int second = cal.get(Calendar.SECOND); //取得秒
int week = cal.get(Calendar.DAY_OF_WEEK)-1; //星期
filed | 数值 | 含义 |
---|---|---|
ERA | 0 | 公元AD/公元前BC |
YEAR | 1 | 四位数的年份,比如:2019 |
MONTH | 2 | 月份,取值:0-11,对应1月-12月 |
WEEK_OF_YEAR | 3 | 本年中的第几周 |
WEEK_OF_MONTH | 4 | 本月中的第几周 |
DATE | 5 | 本月中第几天,相当于日历中“日” |
DAY_OF_MONTH | 5 | 本月中第几天,相当于日历中“日” |
DAY_OF_YEAR | 6 | 本年中第几天 |
DAY_OF_WEEK | 7 | 取值1-7,对应星期日-星期六 |
DAY_OF_WEEK_IN_MONTH | 8 | 某月中第几周(按日计算,每7天一周) |
AM_PM | 9 | 上下午的区分 |
HOUR | 10 | 小时(0 - 11) |
HOUR_OF_DAY | 11 | 小时(0 - 23) |
MINUTE | 12 | 分钟 |
SECOND | 13 | 秒 |
MILLISECOND | 14 | 毫秒 |
ZONE_OFFSET | 15 | 时区相关 |
DST_OFFSET | 16 | 时区相关 |
FIELD_COUNT | 17 | 属性总数 |
4.1.3 set(int field, int value)返回值:void
为某个filed属性设置值
(1)为年设置值
cal.set(Calendar.YEAR, 1995);
(2)为月设置值
cal.set(Calendar.MONTH, 5); //6月
cal.set(Calendar.MONTH, Calendar.JUNE); //6月
月份 | 英文 | 数值 |
---|---|---|
1月 | JANUARY | 0 |
2月 | FEBRUARY | 1 |
3月 | MARCH | 2 |
4月 | APRIL | 3 |
5月 | MAY | 4 |
6月 | JUNE | 5 |
7月 | JULY | 6 |
8月 | AUGUST | 7 |
9月 | SEPTEMBER | 8 |
10月 | OCTOBER | 9 |
11月 | NOVEMBER | 10 |
12月 | DECEMBER | 11 |
(3)为日设置值
cal.set(Calendar.DAY_OF_MONTH, 15); //15日
小时,分钟,秒的设置类似,略
(4) 设置星期
如果直接为Calendar对象设置星期,时间会强制按照星期对应的日期进行更改
比如某个Calendar对象表示的是2019年4月11日(星期四)
通过代码
cal.set(Calendar.DAY_OF_WEEK, 7);//星期六
cal.set(Calendar.DAY_OF_WEEK,Calendar.SATURDAY);//星期六
这个对象变成了2019年4月13日(星期六),会将cal对象设置其所在周的星期六。
星期 | 英文 | 数值 |
---|---|---|
星期日 | SUNDAY | 1 |
星期一 | MONDAY | 2 |
星期二 | TUESDAY | 3 |
星期三 | WEDNESDAY | 4 |
星期四 | THURSDAY | 5 |
星期五 | FRIDAY | 6 |
星期六 | SATURDAY | 7 |
4.1.4 set(int year, int month, int day)返回值:void
直接对年月日进行赋值
4.1.5 set(int year, int month, int day, int hour, int minute)返回值:void
直接对年月日时分进行赋值
4.1.6 set(int year, int month, int day, int hour, int minute, int second)返回值:void
直接对年月日时分秒进行赋值
cal.set(1998, Calendar.JULY, 11, 23, 12, 0); //1998-07-11 23:12:00
4.1.7 getTime()返回值:java.util.Date
将Calendar对象转换成java.util.Date对象
Date date = cal.getTime();
4.1.8 getTimeInMillis()返回值:long
得到时间对应的毫秒数
long mill = cal.getTimeInMillis();
5. java.text.SimpleDateFormat
提供了可以在String和java.util.Date之间进行类型转换的方法
5.1 构造方法和时间表示格式
SimpleDateFormat的构造方法有多个,参考API文档。其中最重要的是
- new SimpleDateFormat(String format)
format字符串是用于描述转换类的适用的日期格式,其由一些特殊的字符组成
字符 | 时间描述 | 示例 |
---|---|---|
G | 公元 | 公元AD/公元前BC |
y | 四位数年 | 2019 |
Y | 两位数年 | 19 |
M | 月 | 07 |
L | 月 | 07 |
w | 年中第几周 | 27 |
W | 月中第几周 | 3 |
D | 年中第几天 | 1-365 |
d | 月中第几天 | 1-31 |
a | 上下午 | AM/PM |
H | 小时 | 0-23 |
h | 小时 | 1-12 |
K | 小时 | 0-11 |
k | 小时 | 1-24 |
m | 分钟 | 0-59 |
s | 秒 | 0-59 |
S | 毫秒 | 0-999 |
z | 时区 | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | -0800 |
X | 时区 | -08; -0800; -08:00 |
常见字符的组合用法
format字符组合 | 示例 |
---|---|
yyyy-MM-dd | 1999-07-25 |
MM/dd/yyyy | 07/25/1999 |
yyyy年MM月dd日 | 1999年07月25日 |
yyyy-MM-dd HH:mm:ss | 1999-07-25 11:30:00 |
yyyy-MM-dd HH:mm:ss Z | 1999-07-25 11:30:00 +0800 |
利用SimpleDateFormat类的构造方法创建对象时
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf对象可以将Date类型转换成“yyyy-MM-dd”的字符串,同样也能将“yyyy-MM-dd”的字符串转换成对应的Date对象
5.2 日期转文本(Date->String)
- format(Date date)
返回值:String
将参数date类型按照sdf约定的格式,转换成对应格式的字符串
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String str = sdf.format(d);
System.out.println(str);
输出结果:2019年04月11日 14时29分51秒
5.3 文本转日期(String->Date)
- parse(String str)
返回值:java.util.Date
将参数str按照sdf约定的格式,转换成对应的Date对象
String str = "1994-07-25";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date);
在进行字符串转日期的过程时,可能发生ParseException的异常,主要原因就是字符串str可能与约定的格式不符,或者干脆就不是一个日期