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();