1)本文总结了java8中日期时间常用工具方法;包括:
2)日期时间工具类定义如下:
public class BusiDateTimeUtils {
/** 日期时间格式化器 */
private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/** 日期格式化器 */
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private BusiDateTimeUtils() {
// do nothing.
}
// ....................
}
/** -------------------- 1. 当前日期时间操作 -------------------- */
public static String getNowLocalDateTimeStr() {
return LocalDateTime.now().format(DATETIME_FORMATTER);
}
public static String getNowLocalDateStr() {
return LocalDate.now().format(DATE_FORMATTER);
}
/** -------------------- 1. 当前日期时间操作 -------------------- */
@Test
public void test1() {
// 获取当前日期时间
String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();
System.out.println("nowLocalDateTimeStr="+nowLocalDateTimeStr); // 2023-10-05 21:28:09
// 获取当前日期
String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();
System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05
}
/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */
public static LocalDateTime parseLocalDateTime(String dateTimeStr) {
return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
}
public static LocalDate parseLocalDate(String dateStr) {
return LocalDate.parse(dateStr, DATE_FORMATTER);
}
/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */
@Test
public void test2() {
// 解析当前日期时间
String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();
System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:29:32
LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);
System.out.println(parsedLocalDateTime); // 2023-10-05T21:29:32
// 解析当前日期
String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();
System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05
LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);
System.out.println(parsedLocalDate); // 2023-10-05
}
/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */
public static String format(LocalDateTime localDateTime) {
return localDateTime.format(DATETIME_FORMATTER);
}
public static String format(LocalDate localDate) {
return localDate.format(DATE_FORMATTER);
}
/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */
@Test
public void test3() {
// 格式化当前日期时间对象为字符串
String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();
System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:35:19
LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);
String formatedLocalDateTime = BusiDateTimeUtils.format(parsedLocalDateTime);
System.out.println(formatedLocalDateTime); // 2023-10-05 21:35:19
// 格式化当前日期对象为字符串
String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();
System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05
LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);
String formatedLocalDate = BusiDateTimeUtils.format(parsedLocalDate);
System.out.println(formatedLocalDate); // 2023-10-05
}
/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */
public static LocalDate toLocalDate(LocalDateTime localDateTime) {
return localDateTime.toLocalDate();
}
public static Instant toInstant(LocalDateTime localDateTime) {
return localDateTime.toInstant(ZoneOffset.UTC);
}
public static Date toDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
【说明】LocalDateTime 转 Instant与Date时,做了一些特殊处理:
/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */
@Test
public void test4() {
LocalDateTime nowLocalDateTime = LocalDateTime.now();
System.out.println("nowLocalDateTimeStr="+BusiDateTimeUtils.format(nowLocalDateTime)); // 2023-10-05 21:37:14
// LocalDateTime 转 LocalDate
LocalDate localDate = BusiDateTimeUtils.toLocalDate(nowLocalDateTime);
LocalDate localDate2 = nowLocalDateTime.toLocalDate(); // 与上一行代码效果一样
System.out.println("localDate=" + localDate); // 2023-10-05
// LocalDateTime 转 Instant
Instant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDateTime);
System.out.println(nowInstant); // 2023-10-05T21:37:14.677Z
// LocalDateTime 转 Date
Date nowDate = BusiDateTimeUtils.toDate(nowLocalDateTime);
System.out.println(nowDate); // Thu Oct 05 21:37:14 CST 2023
}
/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */
public static LocalDateTime toLocalDateTime(LocalDate localDate) {
return localDate.atStartOfDay();
}
public static Instant toInstant(LocalDate localDate) {
return localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
}
public static Date toDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
【说明】LocalDate 转 Instant与Date时,做了一些特殊处理:与 LocalDateTime 转 Instant与Date类似 ,这里不再赘述;参见本文章节【4】;
/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */
@Test
public void test5() {
LocalDate nowLocalDate = LocalDate.now();
System.out.println("nowLocalDateStr="+BusiDateTimeUtils.format(nowLocalDate)); // 2023-10-05
// LocalDate 转 LocalDateTime
LocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowLocalDate);
System.out.println("localDateTime=" + localDateTime); // 2023-10-05T00:00
// LocalDate 转 Instant
Instant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDate);
System.out.println(nowInstant); // 2023-10-05T00:00
// LocalDate 转 Date
Date nowDate = BusiDateTimeUtils.toDate(nowLocalDate);
System.out.println(nowDate); // Thu Oct 05 00:00:00 CST 2023
}
/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */
public static LocalDateTime toLocalDateTime(Instant instantWithoutZone) {
return LocalDateTime.ofInstant(instantWithoutZone, ZoneOffset.UTC);
}
public static LocalDate toLocalDate(Instant instantWithoutZone) {
return toLocalDateTime(instantWithoutZone).toLocalDate();
}
public static Date toDate(Instant instantWithoutZone) {
return toDate(toLocalDateTime(instantWithoutZone));
}
【说明】
注意上述工具方法中入参 Instant变量是不带时区的,也可以理解为时区为UTC(0时区);
/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */
@Test
public void test6() {
Instant nowInstantWithoutZone = LocalDateTime.now().toInstant(ZoneOffset.UTC);
System.out.println("nowZonedInstant="+nowInstantWithoutZone); // 2023-10-05T22:00:54.783Z
System.out.println("Instant.now()=" + Instant.now()); // 2023-10-05T14:00:54.798Z(注意这里晚了8个小时)
// Instant 转 LocalDateTime
LocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowInstantWithoutZone);
System.out.println("localDateTime=" + localDateTime); // 2023-10-05T22:00:54.783
// Instant 转 LocalDate
LocalDate localDate = BusiDateTimeUtils.toLocalDate(nowInstantWithoutZone);
System.out.println("localDate=" + localDate); // 2023-10-05
// Instant 转 Date
Date date = BusiDateTimeUtils.toDate(nowInstantWithoutZone);
System.out.println("date=" + date); // date=Thu Oct 05 22:00:54 CST 2023
}
/** -------------------- 7. 带时区的日期时间 -------------------- */
@Test
public void test7() {
LocalDateTime nowLocalDateTime = LocalDateTime.now();
System.out.println("nowLocalDateTime=" + nowLocalDateTime); // 2023-10-05T22:19:10.812
// 转为带时区的日期时间(系统时区)
System.out.println("ZoneId.systemDefault()=" + ZoneId.systemDefault()); // Asia/Shanghai
ZonedDateTime zonedDateTime = nowLocalDateTime.atZone(ZoneId.systemDefault());
System.out.println("zonedDateTime.toInstant()(系统时区)="+zonedDateTime.toInstant()); // 2023-10-05T14:19:10.812Z(晚8个小时)
// 转为带时区的日期时间(0时区)
zonedDateTime = nowLocalDateTime.atZone(ZoneOffset.UTC);
System.out.println("zonedDateTime.toInstant()(0时区)="+zonedDateTime.toInstant()); // 2023-10-05T22:19:10.812Z
}
【说明】
/**
* @Description 日期时间工具类
* @author xiao tang
* @version 1.0.0
* @createTime 2023年10月05日
*/
public class BusiDateTimeUtils {
/** 日期时间格式化器 */
private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/** 日期格式化器 */
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private BusiDateTimeUtils() {
// do nothing.
}
/** -------------------- 1. 当前日期时间操作 -------------------- */
public static String getNowLocalDateTimeStr() {
return LocalDateTime.now().format(DATETIME_FORMATTER);
}
public static String getNowLocalDateStr() {
return LocalDate.now().format(DATE_FORMATTER);
}
/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */
public static LocalDateTime parseLocalDateTime(String dateTimeStr) {
return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
}
public static LocalDate parseLocalDate(String dateStr) {
return LocalDate.parse(dateStr, DATE_FORMATTER);
}
/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */
public static String format(LocalDateTime localDateTime) {
return localDateTime.format(DATETIME_FORMATTER);
}
public static String format(LocalDate localDate) {
return localDate.format(DATE_FORMATTER);
}
/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */
public static LocalDate toLocalDate(LocalDateTime localDateTime) {
return localDateTime.toLocalDate();
}
public static Instant toInstant(LocalDateTime localDateTime) {
return localDateTime.toInstant(ZoneOffset.UTC);
}
public static Date toDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */
public static LocalDateTime toLocalDateTime(LocalDate localDate) {
return localDate.atStartOfDay();
}
public static Instant toInstant(LocalDate localDate) {
return localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
}
public static Date toDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */
public static LocalDateTime toLocalDateTime(Instant instantWithoutZone) {
return LocalDateTime.ofInstant(instantWithoutZone, ZoneOffset.UTC);
}
public static LocalDate toLocalDate(Instant instantWithoutZone) {
return toLocalDateTime(instantWithoutZone).toLocalDate();
}
public static Date toDate(Instant instantWithoutZone) {
return toDate(toLocalDateTime(instantWithoutZone));
}
}
/**
* @Description 日期时间工具类单测案例
* @author xiao tang
* @version 1.0.0
* @createTime 2023年10月05日
*/
public class BusiDateTimeUtilsTest {
/** -------------------- 1. 当前日期时间操作 -------------------- */
@Test
public void test1() {
// 获取当前日期时间
String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();
System.out.println("nowLocalDateTimeStr="+nowLocalDateTimeStr); // 2023-10-05 21:28:09
// 获取当前日期
String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();
System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05
}
/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */
@Test
public void test2() {
// 解析当前日期时间
String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();
System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:29:32
LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);
System.out.println(parsedLocalDateTime); // 2023-10-05T21:29:32
// 解析当前日期
String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();
System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05
LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);
System.out.println(parsedLocalDate); // 2023-10-05
}
/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */
@Test
public void test3() {
// 格式化当前日期时间对象为字符串
String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();
System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:35:19
LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);
String formatedLocalDateTime = BusiDateTimeUtils.format(parsedLocalDateTime);
System.out.println(formatedLocalDateTime); // 2023-10-05 21:35:19
// 格式化当前日期对象为字符串
String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();
System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05
LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);
String formatedLocalDate = BusiDateTimeUtils.format(parsedLocalDate);
System.out.println(formatedLocalDate); // 2023-10-05
}
/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */
@Test
public void test4() {
LocalDateTime nowLocalDateTime = LocalDateTime.now();
System.out.println("nowLocalDateTimeStr="+BusiDateTimeUtils.format(nowLocalDateTime)); // 2023-10-05 21:37:14
// LocalDateTime 转 LocalDate
LocalDate localDate = BusiDateTimeUtils.toLocalDate(nowLocalDateTime);
LocalDate localDate2 = nowLocalDateTime.toLocalDate(); // 与上一行代码效果一样
System.out.println("localDate=" + localDate); // 2023-10-05
// LocalDateTime 转 Instant
Instant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDateTime);
System.out.println(nowInstant); // 2023-10-05T21:37:14.677Z
// LocalDateTime 转 Date
Date nowDate = BusiDateTimeUtils.toDate(nowLocalDateTime);
System.out.println(nowDate); // Thu Oct 05 21:37:14 CST 2023
}
/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */
@Test
public void test5() {
LocalDate nowLocalDate = LocalDate.now();
System.out.println("nowLocalDateStr="+BusiDateTimeUtils.format(nowLocalDate)); // 2023-10-05
// LocalDate 转 LocalDateTime
LocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowLocalDate);
System.out.println("localDateTime=" + localDateTime); // 2023-10-05T00:00
// LocalDate 转 Instant
Instant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDate);
System.out.println(nowInstant); // 2023-10-05T00:00
// LocalDate 转 Date
Date nowDate = BusiDateTimeUtils.toDate(nowLocalDate);
System.out.println(nowDate); // Thu Oct 05 00:00:00 CST 2023
}
/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */
@Test
public void test6() {
Instant nowInstantWithoutZone = LocalDateTime.now().toInstant(ZoneOffset.UTC);
System.out.println("nowZonedInstant="+nowInstantWithoutZone); // 2023-10-05T22:00:54.783Z
System.out.println("Instant.now()=" + Instant.now()); // 2023-10-05T14:00:54.798Z(注意这里晚了8个小时)
// Instant 转 LocalDateTime
LocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowInstantWithoutZone);
System.out.println("localDateTime=" + localDateTime); // 2023-10-05T22:00:54.783
// Instant 转 LocalDate
LocalDate localDate = BusiDateTimeUtils.toLocalDate(nowInstantWithoutZone);
System.out.println("localDate=" + localDate); // 2023-10-05
// Instant 转 Date
Date date = BusiDateTimeUtils.toDate(nowInstantWithoutZone);
System.out.println("date=" + date); // date=Thu Oct 05 22:00:54 CST 2023
}
}