java时间
Java表示时间主要使用的有三个类:
-
Date
:java.util.Date
,主要用时间戳表示时间 -
SimpleDateFormat
:日期格式化类 -
Calendar
:日期抽象类
Date
其一个对象表示一个时间戳,没有时区概念,都是从1970-1-1 00:00:00 +0:00开始的毫秒数
构造方法
有两个构造方法:
Date()
:
使用当前时间戳来初始化对象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表示时区,可以表示四个时区(有歧义):
- 中国标准时间:China Standard Time UT+8:00
- 美国中部时间:Central Standard Time (USA) UT-6:00
- 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
- 古巴标准时间:Cuba Standard Time UT-4:00
这里由于我在中国,所以CST表示的是中国标准时间,也就是北京时间
因为北京时间比格林威治标准时(GMT)快八小时,所以时间戳0是从Thu Jan 01 08:00:00 CST 1970
开始
常用方法
-
long getTime()
:获取时间戳(毫秒级) -
void setTime(long time)
:用time时间戳(毫秒级)设置对象的时间 -
boolean after(Date date)
:若当调用此方法的Date对象在指定日期date之后返回true,否则返回false。 -
boolean before(Date date)
:若当调用此方法的Date对象在指定日期date之前返回true,否则返回false。 -
int compareTo(Date date)
:比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。 -
Object clone()
:返回此对象的副本。
SimpleDateFormat
由于时间戳表示时间非常不直观,可读性差,所以就出现了SimpleDateFormat
来格式化时间
构造方法
常用有3个:
-
SimpleDateFormat()
:根据当地的时间习惯设置格式 -
SimpleDateFormat(String pattern)
:pattern
指定时间格式,最常用 -
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
常用方法
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
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
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 2020
比2020-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的实现类
常用方法
Date getTime()
:获取其对应的Date对象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
void set(int year, int month, int date)
:设置年份,月份,日期,这里的date,准确的说不是多少号,而是从这个月1号开始的第几天,第一天就是1号。month从0开始,所以最好使用Calendar的静态变量。类似的重载还有
void set(int year, int month, int date, int hourOfDay, int minute)
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
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
int get(int field)
:获取某个字段field的值
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));// 2020
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()