java时间

Java表示时间主要使用的有三个类:

  1. Datejava.util.Date,主要用时间戳表示时间
  2. SimpleDateFormat :日期格式化类
  3. Calendar:日期抽象类

Date

其一个对象表示一个时间戳,没有时区概念,都是从1970-1-1 00:00:00 +0:00开始的毫秒数

构造方法

有两个构造方法:

  1. Date()
    使用当前时间戳来初始化对象
  2. Date(long millisec)
    接收一个参数,该参数是从1970-1-1 00:00:00 +0:00起的毫秒数。

例如:

Date date1 = new Date();
System.out.println(date1);// Sun Jul 26 15:21:47 CST 2020

Date date2 = new Date(0);
System.out.println(date2);// Thu Jan 01 08:00:00 CST 1970

其中的CST表示时区,可以表示四个时区(有歧义):

  1. 中国标准时间:China Standard Time UT+8:00
  2. 美国中部时间:Central Standard Time (USA) UT-6:00
  3. 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
  4. 古巴标准时间:Cuba Standard Time UT-4:00

这里由于我在中国,所以CST表示的是中国标准时间,也就是北京时间

因为北京时间比格林威治标准时(GMT)快八小时,所以时间戳0是从Thu Jan 01 08:00:00 CST 1970开始

常用方法

  1. long getTime():获取时间戳(毫秒级)
  2. void setTime(long time):用time时间戳(毫秒级)设置对象的时间
  3. boolean after(Date date):若当调用此方法的Date对象在指定日期date之后返回true,否则返回false。
  4. boolean before(Date date):若当调用此方法的Date对象在指定日期date之前返回true,否则返回false。
  5. int compareTo(Date date):比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
  6. Object clone():返回此对象的副本。

SimpleDateFormat

由于时间戳表示时间非常不直观,可读性差,所以就出现了SimpleDateFormat来格式化时间

构造方法

常用有3个:

  1. SimpleDateFormat():根据当地的时间习惯设置格式
  2. SimpleDateFormat(String pattern)pattern指定时间格式,最常用
  3. SimpleDateFormat(String pattern, Locale locale)pattern指定时间格式,Locale设置地区

例如

Date date = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat();
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);

System.out.println(sdf1.format(date));// 20-7-26 下午4:11
System.out.println(sdf2.format(date));// 2020-07-26 16:11:27
System.out.println(sdf3.format(date));// 2020-07-26 16:11:27

常用方法

  1. String format(Date date):将date格式化为指定格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
System.out.println(sdf.format(date));// 2020-07-26
  1. Date parse(String source):将时间字符串source根据指定格式,解析成Date对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2020-01-02");
System.out.println(date);// Thu Jan 02 00:00:00 CST 2020
  1. void setTimeZone(TimeZone zone):设定时区
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 设置时区为GMT+00:00
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
// 按GMT时区,解析时间2020-01-02 00:00:00
Date date = sdf.parse("2020-01-02 00:00:00");
System.out.println(date);// Thu Jan 02 08:00:00 CST 2020

注意:输出的时间Thu Jan 02 08:00:00 CST 20202020-01-02 00:00:00快了八小时,是因为sdf的时区是GMT,所以当解析2020-01-02 00:00:00时,会按GMT的标准转换成date时间戳。而我现在在中国,所以输出时会转换为北京时间。

格式化编码表

字母

描述

示例

G

纪元标记

AD

y

四位年份

2001

M

月份

July or 07

d

一个月的日期

10

h

A.M./P.M. (1~12)格式小时

12

H

一天中的小时 (0~23)

22

m

分钟数

30

s

秒数

55

S

毫秒数

234

E

星期几

Tuesday

D

一年中的日子

360

F

一个月中第几周的周几

2 (second Wed. in July)

w

一年中第几周

40

W

一个月中第几周

1

a

A.M./P.M. 标记

PM

k

一天中的小时(1~24)

24

K

A.M./P.M. (0~11)格式小时

10

z

时区

Eastern Standard Time


文字定界符

Delimiter

"

单引号

`


Calendar

Calendar类虽说是日历类,但它其实不只含有日期,还有时分秒,时区等信息,功能比Date强大

初始化

由于Calendar是一个抽象类,所以初始化时,需要调用其静态方法Calendar.getInstance()获取对象,默认是当前时间

Calendar.getInstance()返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar是Calendar的实现类

常用方法

  1. Date getTime():获取其对应的Date对象
  2. void set(int field, int value):设置某个字段field的值为value
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// Sun Jul 26 17:27:35 CST 2020
calendar.set(Calendar.YEAR, 1999);
System.out.println(calendar.getTime());// Mon Jul 26 17:27:35 CST 1999
  1. void set(int year, int month, int date):设置年份,月份,日期,这里的date,准确的说不是多少号,而是从这个月1号开始的第几天,第一天就是1号。month从0开始,所以最好使用Calendar的静态变量。类似的重载还有
  1. void set(int year, int month, int date, int hourOfDay, int minute)
  2. void set(int year, int month, int date, int hourOfDay, int minute, int second)
Calendar calendar = Calendar.getInstance();
calendar.set(1999, Calendar.DECEMBER,25);
System.out.println(calendar.getTime());// Sat Dec 25 17:33:18 CST 1999
  1. void add(int field, int amount):给某个字段field加上amount
Calendar calendar = Calendar.getInstance();
calendar.set(1999, Calendar.DECEMBER,15);
calendar.add(Calendar.DATE, 10);
System.out.println(calendar.getTime());// Sat Dec 25 17:41:12 CST 1999
  1. int get(int field):获取某个字段field的值
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));// 2020
  1. long getTimeInMillis():获取时间戳

常用字段

字段(省略Calendar.)

描述

YEAR


MONTH


DATE


DAY_OF_MONTH

几号,当月的第几天,同DATE

DAY_OF_WEEK

星期几,1表示周日

DAY_OF_WEEK_IN_MONTH

一个月的第几周,以该月1号的星期为一周的开头

DAY_OF_YEAR

一年的第几天,

HOUR_OF_DAY

时,24小时制

HOUR

时,12小时制

MINUTE


SECOND


AM_PM

AM或PM

MILLISECOND

毫秒

WEEK_OF_MONTH

一个月的第几周,以周日为一周的开头

WEEK_OF_YEAR

一年的第几周


扩展

获取时间戳的方法

执行效率从高到低依次为

System.currentTimeMillis()
new Date().getTime()
Calendar.getInstance().getTimeInMillis()