一、前言
在 JDK 8 之前,Java 语言为我们提供了两个类用于操作时间,它们分别是:java.util.Date 和 java.util.Calendar,
但在 JDK 8 的时候为了解决旧时间操作类的一些缺陷,提供了几个新的类,用于操作时间和人气,
它们分别是:LocalTime、LocalDateTime、Instant,都位于 java.time 包下。
时间的操作在我们日常的开发中经常见到,比如,业务数据都要记录创建时间和修改时间,并要把这些时间格式化之后显示到前端页面,再比如我们需要计算业务数据的时间间隔等,都离不开对时间的操作。
时间戳:时间戳是指格林威治时间 1970-01-01 00:00:00(北京时间 1970-01-01 08:00:00)起至现在的总秒数。
二、获取时间
类 |
获取时间 |
说明 |
使用频率 |
java.util.Date |
new Date() |
Date对象 |
少用 |
System |
System.currentTimeMillis() |
时间戳 |
常用 |
java.util.Calendar |
Calendar.getInstance().getTime() |
Date升级版 |
较常用 |
java.time.LocalDate |
LocalDate.now() |
只有日期 |
推荐 (JDK1.8新API) |
java.time.LocalTime |
LocalTime.now() |
只有时间 |
推荐 (JDK1.8新API) |
java.time.LocalDateTime |
LocalDateTime.now() |
日期时间 |
推荐 (JDK1.8新API) |
java.time.ZonedDateTime |
ZonedDateTime.now() |
有时区 |
推荐 (JDK1.8新API) |
Instant |
Instant.now() |
时刻 |
推荐 (JDK1.8新API) |
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Calendar;
import java.util.Date;
public class CurrentTime {
public static void main(String[] args) {
//getByDate();
//getBySystem();
//getByCalendar();
//getByLocalDate();
//getByLocalTime();
//getByLocalDateTime();
//getByZonedDateTime();
//getByInstant();
}
// 使用java.util.Date类
public static void getByDate(){
Date date = new Date();
//SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//System.out.println(format.format(date));
System.out.println(date);
}
// 使用System类
public static void getBySystem(){
long l = System.currentTimeMillis();
Date date = new Date(l);
System.out.println(date);
}
// 使用Calendar类
public static void getByCalendar(){
Date time = Calendar.getInstance().getTime();
System.out.println(time);
}
// 使用LocalDate类:只有日期,无时间
public static void getByLocalDate(){
LocalDate now = LocalDate.now();
System.out.println(now);
}
// 使用LocalTime类:只有时间,无日期
public static void getByLocalTime(){
LocalTime now = LocalTime.now();
System.out.println(now);
}
// 使用LocalDateTime类
public static void getByLocalDateTime(){
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
}
// 使用ZonedDateTime类
public static void getByZonedDateTime(){
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
}
// 使用Instant类
public static void getByInstant(){
Instant now = Instant.now();
System.out.println(now);
}
}
三、格式化时间
1、JDK8之前的操作
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(new Date())); // output:2022-08-06 21:46:22
SimpleDateFormat 构造参数的含义,请参考以下表格信息:
字符 |
含义 |
示例 |
y |
年 |
yyyy-1996 |
M |
月 |
MM-07 |
d |
月中的天数 |
dd-02 |
D |
年中的天数 |
121 |
E |
星期几 |
星期四 |
H |
小时数(0-23) |
HH-23 |
h |
小时数(0-12) |
hh-11 |
m |
分钟数 |
mm-02 |
s |
秒数 |
ss-03 |
Z |
时区 |
+0800 |
使用示例:
- 获取星期几:new SimpleDateFormat("E").format(new Date())
- 获取当前时区:new SimpleDateFormat("Z").format(new Date*())
2、JDK8的操作
// 时间格式化①
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timeFormat = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(timeFormat); // output:2019-08-16 21:15:43
// 时间格式化②
String timeFormat2 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(timeFormat2); // output:2019-08-16 21:17:48