Java中的时间API有数种,如Date或LocalDateTime,笔者根据实际的开发经验,在这里罗列出一些常用并且尽可能通用的时间API操作,避免由于记忆过多无效API导致效率低下的问题
目录
LocalDateTime
LocalDateTime 与 String 的相互转换
Date
Date 与 String 的相互转换
Calendar
LocalDateTime
Java8引入了LocalDateTime(年月日时分秒)、LocalDate(年月日)和LocalTime(时分秒),LocalDate和LocalTime可以组合成LocalDateTime(即 年月日 和 时分秒 组装成 年月日时分秒 ),相关的API为
public static LocalDateTime of(LocalDate date, LocalTime time)此外,LocalDateTime还能通过其他的 of() 方法获取,最常用的就是指定年月日时分秒获取LocalDateTime
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)如当前代码需要获取 2024-12-24 00:00:00 的LocalDateTime,方式如下
LocalDateTime localDateTime = LocalDateTime.of(2024, 12, 24, 0, 0, 0);既然LocalDateTime可以通过 of() 方法获取,那么LocalDate和LocalTime按道理也可以用 of() 获取,实际情况也确实如此
可以通过指定年月日获取LocalDate
public static LocalDate of(int year, int month, int dayOfMonth)也可以通过指定时分秒获取LocalTime
public static LocalTime of(int hour, int minute, int second)在上面的例子中我们通过LocalDateTime的 of() 方法获取到 2024-12-24 00:00:00 ,下面我们将演示如何通过LocalDate和LocalTime获取到 2024-12-24 00:00:00 的LocalDateTime,方式如下
// 指定年月日
LocalDate localDate = LocalDate.of(2024, 12, 24);
// 指定时分秒
LocalTime localTime = LocalTime.of(0, 0, 0);
// 将 年月日 和 时分秒 组装成 年月日时分秒
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);最后,介绍一下获取当前时间的LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();LocalDateTime 与 String 的相互转换
String 转 LocalDateTime
将字符串类型转为时间类型,一定会涉及到字符串的解析,顾名思义,需要调用 parse() 方法
public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)第一个参数填写需要解析的字符串,第二个参数填写解析器,用来解析第一个字符串,得到LocalDateTime。解析器通过下面这种方式获取
public static DateTimeFormatter ofPattern(String pattern)pattern用来指明如何解析时间。比如我们现在需要将String类型的 "2024-12-24 23:59:59" 解析为 LocalDateTime 格式,方式如下
// 需要解析的字符串
String str = "2024-12-24 23:59:59";
// 根据字符串格式创建解析器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 将字符串解析为时间
LocalDateTime localDateTime = LocalDateTime.parse(str, formatter);LocalDateTime 转 String
LocalDateTime可以格式化为字符串类型,方法为 format()
public String format(DateTimeFormatter formatter)这个DateTimeFormatter就是上面例子中的解析器,因此在上面例子的基础上,我们可以将LocalDateTime再转回String,只不过这次我们需要的时间格式是 "yyyy/MM/dd HH:mm:ss" ,方式如下
// 上面例子的字符串转时间
String str = "2024-12-24 23:59:59";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(str, formatter);// 设置格式化器,指定时间格式为 yyyy/MM/dd HH:mm:ss
DateTimeFormatter LocalDateTime2StringFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
// 通过格式化器将 LocalDateTime 解析为 String
String format = localDateTime.format(LocalDateTime2StringFormatter);总结:LocalDateTime和String进行互相转换时,都需要DateTimeFormatter参与,DateTimeFormatter通过ofPattern()获取
Date
Date也可以通过指定年月日时分秒的方式创建,但是这种方式已经废弃了,目前会采用Calendar的方式获取Date,Calendar将在下文介绍。在这里仅介绍一下获取当前时间的Date
Date date = new Date();Date 与 String 的相互转换
上面我们通过一个解析器,完成了LocalDateTime和String的互相转换,这里能否举一反三,也通过一个解析器完成Date和String之间的转换呢?答案是可以的。在Date相关的API中,这个解析器是 SimpleDateFormat,它的创建方式如下
SimpleDateFormat formatter = new SimpleDateFormat(String pattern);通过解析器,我们可以实现Date和String之间的相互转换
String 转 Date
如果希望获取一个格式为"yyyy-MM-dd HH:mm:ss"的时间,就需要提供这样一个解析器,用来将字符串解析为时间
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");如当前代码需要将String类型的 "2024-12-24 23:59:59" 解析为Date 格式
String str = "2024-12-24 23:59:59";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = formatter.parse(str);Date 转 String
在上面例子的基础上,我们可以将LocalDateTime再转回String,只不过这次我们需要的时间格式是 "yyyy/MM/dd HH:mm:ss" ,方式如下
// 上面例子的字符串转时间
String str = "2024-12-24 23:59:59";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = formatter.parse(str);// 设置格式化器,指定时间格式为 yyyy/MM/dd HH:mm:ss
SimpleDateFormat date2StringFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// 通过格式化器将 Date 解析为 String
String format = date2StringFormatter.format(date);Calendar
如果需要通过指定年月日时分秒的方式获取Date,还可以使用Calendar
如当前需要获取 2024-12-24 00:00:00 的时间,方式如下
// 通过 getInstance() 方法获取Calendar对象
Calendar instance = Calendar.getInstance();
// 设置年月日时分秒
instance.set(2024, 12, 24, 0, 0, 0);
// getTime方法获取时间
Date date = instance.getTime();