廈門中小企業(yè)網(wǎng)站制作網(wǎng)絡(luò)媒體發(fā)稿平臺
【README】
1)本文總結(jié)了java8中日期時間常用工具方法;包括:
- 日期時間對象格式化為字符串;
- 日期時間字符串解析為日期時間對象;
- 日期時間對象轉(zhuǎn)換;
- 轉(zhuǎn)換過程中,需要注意的是: Instant與Date帶時區(qū)(易變),而LocalDateTime,LocalDate,LocalTime 不帶時區(qū)(不可變);
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】當(dāng)前日期時間操作
/** -------------------- 1. 當(dāng)前日期時間操作 -------------------- */public static String getNowLocalDateTimeStr() {return LocalDateTime.now().format(DATETIME_FORMATTER);}public static String getNowLocalDateStr() {return LocalDate.now().format(DATE_FORMATTER);}
【1.1】單測案例:
/** -------------------- 1. 當(dāng)前日期時間操作 -------------------- */@Testpublic void test1() {// 獲取當(dāng)前日期時間String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+nowLocalDateTimeStr); // 2023-10-05 21:28:09// 獲取當(dāng)前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05}
【2】字符串解析為日期時間對象
/** -------------------- 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.1】單測案例
/** -------------------- 2. 字符串解析為日期時間對象 -------------------- */@Testpublic void test2() {// 解析當(dāng)前日期時間String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:29:32LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);System.out.println(parsedLocalDateTime); // 2023-10-05T21:29:32// 解析當(dāng)前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);System.out.println(parsedLocalDate); // 2023-10-05}
【3】日期時間對象格式化為字符串
/** -------------------- 3. 日期時間對象格式化為字符串 -------------------- */public static String format(LocalDateTime localDateTime) {return localDateTime.format(DATETIME_FORMATTER);}public static String format(LocalDate localDate) {return localDate.format(DATE_FORMATTER);}
【3.1】單測案例
/** -------------------- 3. 日期時間對象格式化為字符串 -------------------- */@Testpublic void test3() {// 格式化當(dāng)前日期時間對象為字符串String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:35:19LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);String formatedLocalDateTime = BusiDateTimeUtils.format(parsedLocalDateTime);System.out.println(formatedLocalDateTime); // 2023-10-05 21:35:19// 格式化當(dāng)前日期對象為字符串String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);String formatedLocalDate = BusiDateTimeUtils.format(parsedLocalDate);System.out.println(formatedLocalDate); // 2023-10-05}
【4】*LocalDateTime 轉(zhuǎn)為其他日期時間類型(重要)
/** -------------------- 4. LocalDateTime 轉(zhuǎn)為其他日期時間類型 -------------------- */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 轉(zhuǎn) Instant與Date時,做了一些特殊處理:
- LocalDateTime沒有時區(qū),而Instant有時區(qū);為了統(tǒng)一,把Instant的時區(qū)設(shè)置為0時區(qū)(UTC),則LocalDateTime與Instant都沒有時區(qū)了;
- LocalDateTime沒有時區(qū),Instant有時區(qū),Date有時區(qū):
- 先把 LocalDateTime轉(zhuǎn)為帶時區(qū)的日期時間 ZonedDateTime;
- 再把 ZonedDateTime 轉(zhuǎn) Instant(默認(rèn)時區(qū)為系統(tǒng)時區(qū));
- 最后把Instant轉(zhuǎn)Date(默認(rèn)時區(qū)為系統(tǒng)時區(qū));?
【4.1】單測案例
/** -------------------- 4. LocalDateTime 轉(zhuǎn)為其他日期時間類型 -------------------- */@Testpublic void test4() {LocalDateTime nowLocalDateTime = LocalDateTime.now();System.out.println("nowLocalDateTimeStr="+BusiDateTimeUtils.format(nowLocalDateTime)); // 2023-10-05 21:37:14// LocalDateTime 轉(zhuǎn) LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowLocalDateTime);LocalDate localDate2 = nowLocalDateTime.toLocalDate(); // 與上一行代碼效果一樣System.out.println("localDate=" + localDate); // 2023-10-05// LocalDateTime 轉(zhuǎn) InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDateTime);System.out.println(nowInstant); // 2023-10-05T21:37:14.677Z// LocalDateTime 轉(zhuǎn) DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDateTime);System.out.println(nowDate); // Thu Oct 05 21:37:14 CST 2023 }
【5】LocalDate 轉(zhuǎn)為其他日期時間類型
/** -------------------- 5. LocalDate 轉(zhuǎn)為其他日期時間類型 -------------------- */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 轉(zhuǎn) Instant與Date時,做了一些特殊處理:與 LocalDateTime 轉(zhuǎn) Instant與Date類似 ,這里不再贅述;參見本文章節(jié)【4】;
【5.1】單測案例
/** -------------------- 5. LocalDate 轉(zhuǎn)為其他日期時間類型 -------------------- */@Testpublic void test5() {LocalDate nowLocalDate = LocalDate.now();System.out.println("nowLocalDateStr="+BusiDateTimeUtils.format(nowLocalDate)); // 2023-10-05// LocalDate 轉(zhuǎn) LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowLocalDate);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T00:00// LocalDate 轉(zhuǎn) InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDate);System.out.println(nowInstant); // 2023-10-05T00:00// LocalDate 轉(zhuǎn) DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDate);System.out.println(nowDate); // Thu Oct 05 00:00:00 CST 2023}
【6】Instant 轉(zhuǎn)為其他日期時間類型
/** -------------------- 6. Instant 轉(zhuǎn)為其他日期時間類型 -------------------- */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));}
【說明】
注意上述工具方法中入?yún)?Instant變量是不帶時區(qū)的,也可以理解為時區(qū)為UTC(0時區(qū));
【6.1】單測案例
/** -------------------- 6. Instant 轉(zhuǎn)為其他日期時間類型 -------------------- */@Testpublic void test6() {Instant nowInstantWithoutZone = LocalDateTime.now().toInstant(ZoneOffset.UTC);System.out.println("nowZonedInstant="+nowInstantWithoutZone); // 2023-10-05T22:00:54.783ZSystem.out.println("Instant.now()=" + Instant.now()); // 2023-10-05T14:00:54.798Z(注意這里晚了8個小時)// Instant 轉(zhuǎn) LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowInstantWithoutZone);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T22:00:54.783// Instant 轉(zhuǎn) LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowInstantWithoutZone);System.out.println("localDate=" + localDate); // 2023-10-05// Instant 轉(zhuǎn) DateDate date = BusiDateTimeUtils.toDate(nowInstantWithoutZone);System.out.println("date=" + date); // date=Thu Oct 05 22:00:54 CST 2023 }
【7】總結(jié)
【7.1】日期時間工具類
/*** @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. 當(dāng)前日期時間操作 -------------------- */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 轉(zhuǎn)為其他日期時間類型 -------------------- */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 轉(zhuǎn)為其他日期時間類型 -------------------- */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 轉(zhuǎn)為其他日期時間類型 -------------------- */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));}
}
【7.2】日期時間工具類單測案例
/*** @Description 日期時間工具類單測案例 * @author xiao tang* @version 1.0.0* @createTime 2023年10月05日*/
public class BusiDateTimeUtilsTest {/** -------------------- 1. 當(dāng)前日期時間操作 -------------------- */@Testpublic void test1() {// 獲取當(dāng)前日期時間String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+nowLocalDateTimeStr); // 2023-10-05 21:28:09// 獲取當(dāng)前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05}/** -------------------- 2. 字符串解析為日期時間對象 -------------------- */@Testpublic void test2() {// 解析當(dāng)前日期時間String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:29:32LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);System.out.println(parsedLocalDateTime); // 2023-10-05T21:29:32// 解析當(dāng)前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);System.out.println(parsedLocalDate); // 2023-10-05}/** -------------------- 3. 日期時間對象格式化為字符串 -------------------- */@Testpublic void test3() {// 格式化當(dāng)前日期時間對象為字符串String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:35:19LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);String formatedLocalDateTime = BusiDateTimeUtils.format(parsedLocalDateTime);System.out.println(formatedLocalDateTime); // 2023-10-05 21:35:19// 格式化當(dāng)前日期對象為字符串String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);String formatedLocalDate = BusiDateTimeUtils.format(parsedLocalDate);System.out.println(formatedLocalDate); // 2023-10-05}/** -------------------- 4. LocalDateTime 轉(zhuǎn)為其他日期時間類型 -------------------- */@Testpublic void test4() {LocalDateTime nowLocalDateTime = LocalDateTime.now();System.out.println("nowLocalDateTimeStr="+BusiDateTimeUtils.format(nowLocalDateTime)); // 2023-10-05 21:37:14// LocalDateTime 轉(zhuǎn) LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowLocalDateTime);LocalDate localDate2 = nowLocalDateTime.toLocalDate(); // 與上一行代碼效果一樣System.out.println("localDate=" + localDate); // 2023-10-05// LocalDateTime 轉(zhuǎn) InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDateTime);System.out.println(nowInstant); // 2023-10-05T21:37:14.677Z// LocalDateTime 轉(zhuǎn) DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDateTime);System.out.println(nowDate); // Thu Oct 05 21:37:14 CST 2023}/** -------------------- 5. LocalDate 轉(zhuǎn)為其他日期時間類型 -------------------- */@Testpublic void test5() {LocalDate nowLocalDate = LocalDate.now();System.out.println("nowLocalDateStr="+BusiDateTimeUtils.format(nowLocalDate)); // 2023-10-05// LocalDate 轉(zhuǎn) LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowLocalDate);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T00:00// LocalDate 轉(zhuǎn) InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDate);System.out.println(nowInstant); // 2023-10-05T00:00// LocalDate 轉(zhuǎn) DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDate);System.out.println(nowDate); // Thu Oct 05 00:00:00 CST 2023}/** -------------------- 6. Instant 轉(zhuǎn)為其他日期時間類型 -------------------- */@Testpublic void test6() {Instant nowInstantWithoutZone = LocalDateTime.now().toInstant(ZoneOffset.UTC);System.out.println("nowZonedInstant="+nowInstantWithoutZone); // 2023-10-05T22:00:54.783ZSystem.out.println("Instant.now()=" + Instant.now()); // 2023-10-05T14:00:54.798Z(注意這里晚了8個小時)// Instant 轉(zhuǎn) LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowInstantWithoutZone);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T22:00:54.783// Instant 轉(zhuǎn) LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowInstantWithoutZone);System.out.println("localDate=" + localDate); // 2023-10-05// Instant 轉(zhuǎn) DateDate date = BusiDateTimeUtils.toDate(nowInstantWithoutZone);System.out.println("date=" + date); // date=Thu Oct 05 22:00:54 CST 2023}
}