Java关于时间操作整理

由于最近的项目中,经常需要对时间进行操作和计算,每次搜索出的计算方式都不一样,为了保证代码的统一性,还是仔细的看一下,java的时间和相关处理类,到底都有什么吧。

Date (java.util.date)

Date类的大部分方法都被标记为Deprecated过时方法。在java1.8之后,增加了新的时间处理类(java.time)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Date date = new Date();

//已被标记为过时
date.getMinutes();
//替代方法为,详见后文
Calendar.get(Calendar.MINUTE);

//仍可使用的方法:
date.toInstant(); //转换为Instant对象

//进行时间的比较
date.after(d); //true date在指定时间之后则返回 true
date.before(d);//false date在指定时间之前则返回 true
date.equals(d);//比较两个日期是否相等

date.compareTo(d);
// 比较当调用此方法的Date对象和指定日期。
// 两者相等时候返回0。
// 调用对象在指定日期之前则返回负数。
// 调用对象在指定日期之后则返回正数。

Time (java.time)

Java1.8新增的类,用来扩展Date的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//获得当前时间 这个时间是精确到纳秒的
Instant instant = Instant.now();
//从默认时区的系统时钟获取当前日期
LocalDate.now();
//从默认时区的系统时钟获取当前时间
LocalTime.now();
//从默认时区的系统时钟获取当前日期和时间
LocalDateTime.now();
//从默认时区的系统时钟获取当前的日期时间时差时区
ZonedDateTime.now();

//将java.util.Date转换为Instant
Instant instant = Instant.ofEpochMilli(new Date().getTime());
//从字符串类型中创建Instant类型的时间
instant = Instant.parse("1995-10-23T10:12:35Z");

//当前时间加上1小时10分钟
Instant instant1 = instant.plus(Duration.ofHours(1).plusMinutes(10));

//计算5天前的时间
instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1
instant.minus(Duration.ofDays(5)); // Option 2 方法2

//计算两个Instant之间的分钟数
long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1
long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2

//Instant可以进行比较
instant1.isAfter(instant), instant1.isBefore(instant));

Calendar (java.util.Calendar)

Calendar可以用来截取时间的各种部分,替代了Date中作废的方法。
Calendar.MONTH 月份是从0开始计算的,所以要记得+1才是真正的月份。

1
2
3
4
5
6
7
8
9
10
Calendar c = Calendar.getInstance(); // 获取当前时间的日历对象
Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); //获取东八区的日历实例对象

c.getTime(); //返回一个Date类型的时间 Fri Apr 30 04:53:38 UTC 2021
c.getTimeInMillis(); //返回当前时间的毫秒数
c.getTimeZone().getDisplayName(); //默认区域的用户的时区名称
c.getTimeZone().getID(); //Asia/Shanghai 返回时区ID

//计算五天前的日期是多少
c.add(Calendar.DAY_OF_MONTH, -5);

GregorianCalendar是一个计算函数,是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
通过此函数可以对日期时间进行计算。

1
2
GregorianCalendar calendar = new GregorianCalendar();
calendar.isLeapYear(2021); //判断是否为闰年 true 闰年

SimpleDateFormat (java.text.SimpleDateFormat)

SimpleDateFormat继承抽象类 DateFormat。 是一个以与语言环境有关的方式来格式化和解析日期的具体类,且非线程安全
通过它我们可以方便的把时间转换为需要的格式。

字母 描述 表示 示例
y 年份 Year 2018;18
M 月份 Month July; Jul; 07
d 月内的日期 Number 10
h 12小时制(1~12) Number 12
H 24小时制 (0~23) Number 22
m 分钟数 Number 30
s 秒数 Number 55
S 毫秒数 Number 234
E 星期几 Text Tuesday
D 年内的天数 Number 180
F 月内的星期 Number 2 (second Wed. in July)
w 年内的周数 Number 40
W 月内的周数 Number 1
a AM/PM 标记 Text PM
k 24小时制(1~24) Number 24
K 12小时制(0~11) Number 10
z 时区 General time zone Eastern Standard Time

PS:表格引用见参考

1
2
3
4
5
// 假设不加Locale.ENGLISH,默认则以本系统语言(中文)显示
Date d = new Date();
// 年份,月份,日,星期,小时,分钟,秒全显示(数位不够,则用 0 填充)。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd a EEEE hh:mm:ss.SSS z ",Locale.ENGLISH);
System.out.println(sdf.format(d)); // 2021/05/08 PM Saturday 17:37:50.432 CST

参考

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×