- LocalTime、LocalDate、LocalDateTime 區(qū)別
-
LocalTime、LocalDate、LocalDateTime 使用
- now 獲取當前 時刻、日期、時間
- of 獲取指定 時刻、日期、時間
- plus || minus 增加或者減少
- 更改指定的 時間
- isAfter || isBefore 比較大小
- compareTo 時間比較
- LocalTime、LocalDate、LocalDateTime 相互轉化
-
String 與 LocalTime、LocalDate、LocalDateTime 相互轉化
- format && parse
- Jackson 全局配置
- Date 與 LocalDate、LocalDateTime 相互轉化
- Long 與 LocalDate、LocalDateTime 相互轉化
-
常用時間操作方法
-
兩個時間相差時間
- Period.between(star,end)
- LocalDate.until
- Duration.between(star,end)
- TemporalAdjuster
- TemporalAdjusters 獲取特殊(指定)時間
-
兩個時間相差時間
LocalTime、LocalDate、LocalDateTime 區(qū)別
LocalTime、LocalDate、LocalDateTime是java8對日期、時間提供的新接口。
jdk1.8 之前的 SimpleDateFormat
是線程不安全的。DateTimeFormatter
是線程安全的
- LocalTime 用于
時刻
的計算(帶有毫秒) - LocalDate 用于
日期
的計算 - LocalDateTime 用于
日期+時刻
的計算 - 額外補充 時間類型 默認格式:
-
Date
Tue Feb 01 00:00:00 CST 2022 -
Timestamp
2022-01-01 00:00:00.0 -
LocalDateTime
2022-01-01T00:00:00.000
-
LocalTime、LocalDate、LocalDateTime 使用
now 獲取當前 時刻、日期、時間
LocalTime now = LocalTime.now();
>>> 獲取當前時刻: 10:20:00.856
LocalDate now = LocalDate.now();
>>> 獲取當前日期: 2023-04-13
LocalDateTime now = LocalDateTime.now();
>>> 獲取當前時間: 2023-04-13T17:29:29.357
- LocalTime 獲取當前時刻默認會帶有毫秒,如果不需要毫秒的話,可以通過設置納秒為0 保留秒
1秒 = 十億納秒
例如:LocalTime.now().withNano(0);
- LocalDateTime 獲取當前日期,默認
toString
會帶有T
用于區(qū)分日期
與時刻
,在項目中,可以通過全局序列化
,進行統(tǒng)一的時間格式輸出為yyyy-MM-dd HH:mm:ss
of 獲取指定 時刻、日期、時間
LocalTime ofTime = LocalTime.of(12, 0, 0);
>>> 獲取指定時刻: 12:00
LocalDate ofTime = LocalDate.of(2023, 4, 13);
>>> 獲取指定日期: 2023-04-13
LocalDateTime ofTime = LocalDateTime.of(2023,4,13,6,10,20,123);
>>> 獲取指定時間: 2023-04-13T06:10:20.000000001
LocalDateTime ofTime = LocalDateTime.of(LocalDate.of(2023, 4, 13),LocalTime.of(12, 0, 0));
>>> 獲取指定時間: 2023-04-13T12:00
- LocalDateTime.of 的參數(shù)單位分別為 年、月、日、小時、分鐘、秒、納秒
- LocaTime 常用常量
// 一天開始時的午夜時刻,“00:00”
LocalTime.MIDNIGHT
// 支持的最小時刻 “00:00” 這是一天開始時的時刻。
LocalTime.MIN
// 支持的最大時刻 “23:59:59.999999999” 這是一天結束時的時刻
LocalTime.MAX
// 中午的時刻 “12:00”
LocalTime.NOON
- 一些比較特殊的獲取方式,例如:
// 根據(jù)秒數(shù) 獲取 時刻 例如:第 150 秒的時刻是 00:02:30 (相似方法同理)
LocalTime.ofSecondOfDay(150)
>>> 獲取指定時刻: 00:02:30
// 獲取指定年限 + 天數(shù) 得到日期,例如:獲取2023年第120天的日期(相似方法同理)
LocalDate.ofYearDay(2023, 120);
>>> 獲取2023年第120天的日期: 2023-04-30
plus || minus 增加或者減少
// 增加 1 星期(相似方法同理)
LocalDateTime.now().plusWeeks(1);
// 增加 1 天(相似方法同理)
LocalDate.now().plusDays(1);
// 增加 1 小時(相似方法同理)
LocalTime.now().plusHours(1);
LocalDateTime.now().plus(10L, ChronoUnit.DAYS);
// 與之相反的 minus 就是減少的意思 不再舉例子說明
更改指定的 時間
// 直接改變 指定時刻
LocalTime.now().withHour(12);
>>> 09:57:23.505 -> 12:57:23.505
// 直接改變 指定日期
LocalDate.now().withDayOfMonth(2);
>>> 2023-04-14 -> 2023-04-02
// 直接改變 指定時間
LocalDateTime.now().withYear(2024);
>>> 2023-04-14T09:59:20.034 -> 2024-04-14T09:59:20.034
- 其他
with
開頭的方法大同小異,但要注意的是,如果改變的值是錯誤的時間,會報錯的,例如:在2月份設置31天
isAfter || isBefore 比較大小
// 8:00
LocalTime time_8 = LocalTime.of(8, 0, 0);
// 9:00
LocalTime time_9 = time_8.plusHours(1);
boolean after = time_9.isAfter(time_8);
>>> 判斷 9:00 是不是在 8:00 之后 >> true
boolean before = time_9.isBefore(time_8);
>>> 判斷 9:00 是不是在 8:00 之前 >> false
- isAfter || isBefore 是無法比較是否相等的,
LocalDate
和LocalDateTime
均有此方法,用法都一樣
compareTo 時間比較
// 8:00
LocalTime time_8 = LocalTime.of(8, 0, 0);
// 9:00
LocalTime time_9 = time_8.plusHours(1);
int i = time_9.compareTo(time_8);
>>> i = 1
int i = time_8.compareTo(time_9);
>>> i = -1
int i = time_8.compareTo(LocalTime.of(8, 0, 0));
>>> i = 0
- 此方法可對比出時間是否相等,假設 A.compareTo(B);
- A > B = 1
- A < B = -1
- A = B = 0
LocalTime、LocalDate、LocalDateTime 相互轉化
// LocalTime + LocalDate = LocalDateTime
LocalDateTime localDateTime = LocalTime.now().atDate(LocalDate.now());
LocalDateTime localDateTime = LocalDate.now().atTime(LocalTime.now());
LocalDateTime localDateTime = LocalDateTime.of(LocalTime.now(),LocalDate.now());
// LocalDateTime 轉 LocalDate
LocalDate localDate = LocalDateTime.now().toLocalDate();
// LocalDateTime 轉 LocalTime
LocalTime localTime = LocalDateTime.now().toLocalTime();
// 獲取今日開始時間 2023-04-21T00:00
LocalDateTime localDateTime = LocalDate.now().atStartOfDay();
// 獲取今日開始時間 2023-04-21T00:00
LocalDateTime startDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
// 獲取今日結束時間 2023-04-21T23:59:59.999999999
LocalDateTime endDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
String 與 LocalTime、LocalDate、LocalDateTime 相互轉化
主要使用 format
和 parse
進行轉換,使用方法基本相同
使用 DateTimeFormatter.ofPattern()
定義時間格式,再進行轉換DateTimeFormatter
線程安全
format && parse
LocalTime.now().toString;
>>> 默認輸出格式 10:50:25.323
LocalDate.now().toString()
>>> 默認輸出格式 2023-04-14
LocalDateTime.now().toString();
>>> 默認輸出格式 2023-04-14T15:59:40
// LocalTime 轉 String 自定義輸出格式,例如:**時**分**秒 該轉化的 00 不會被省略
DateTimeFormatter localTimeFormat = DateTimeFormatter.ofPattern("HH時mm分ss秒");
String time = LocalTime.now().format(localTimeFormat);
>>> 09時11分00秒
// LocalDateTime 轉 String
DateTimeFormatter localTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String time = LocalDateTime.now().format(localTimeFormat);
>>> 2023-04-14 15:59:40
// String 轉 LocalDateTime
LocalDateTime time = LocalDateTime.parse("2023-04-14 15:59:40", localTimeFormat);
Jackson 全局配置
在Stringboot 中,可自定義配置 Jackson 的序列化輸出,使接口在 輸入輸出 統(tǒng)一規(guī)范
簡單舉個例子
@Bean // 裝載配置
@Primary
@ConditionalOnMissingBean
public ObjectMapper objectMapper() {
ObjectMapper mapper = create();
log.info(">>>>> JackSon 全局設置成功,版本號:{}", mapper.version());
return mapper;
}
private static ObjectMapper create() {
ObjectMapper objectMapper = new ObjectMapper();
// 創(chuàng)建自定義 時間轉換 模板
JavaTimeModule timeModule = new JavaTimeModule();
// 定義統(tǒng)一的時間格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
// 序列化 添加 LocalDateTime 類 對應的時間格式
timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
// 反序列化 支持時間戳
timeModule.addDeserializer(LocalDateTime.class, new MillisOrLocalDateTimeDeserializer(dateTimeFormatter));
// 定義統(tǒng)一的日期格式
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA);
// 序列化 添加 LocalDate 類 對應的日期格式
timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter));
// 反序列化
timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter));
// 注冊自定義模板
objectMapper.registerModules(createJavaTimeModules());
return objectMapper;
}
Date 與 LocalDate、LocalDateTime 相互轉化
// Date 轉 LocalDateTime
LocalDateTime localDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
// LocalDateTime 轉 Date
Date date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
// Date轉LocalDate
LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// LocalDate 轉 Date 需要先將 LocalDate 轉 LocalDateTime
Date date= Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
Long 與 LocalDate、LocalDateTime 相互轉化
ZoneOffset.of("+8") 和 ZoneOffset.ofHours(8) 意義相同
long timeMillis = System.currentTimeMillis();
// 時間戳(Long) 轉 LocalDateTime
LocalDateTime localDateTime = Instant.ofEpochMilli(timeMillis).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
// LocalDateTime 轉 時間戳(Long) 秒級
Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8));
// LocalDateTime 轉 時間戳(Long) 毫秒級
Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
// 時間戳(Long) 轉 LocalDate
LocalDate localDate = Instant.ofEpochMilli(timeMillis).atZone(ZoneOffset.ofHours(8)).toLocalDate();
// LocalDate 轉 時間戳(Long) 秒級
Long second = LocalDate.now().atStartOfDay().toEpochSecond(ZoneOffset.ofHours(8));
// LocalDate 轉 時間戳(Long) 毫秒級
Long milliSecond = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
常用時間操作方法
兩個時間相差時間
Period.between(star,end)
統(tǒng)計 相差幾年幾個月幾天
獲得一個由兩個日期之間的年數(shù)、月數(shù)和天數(shù)組成的周期,如果結束在開始之前,則此方法的結果可能是一個負周期。負號在每一年、每一個月和每一天都是一樣的。
LocalDateTime star = LocalDateTime.of(2022, 3, 15, 16, 37, 10);
LocalDateTime end = LocalDateTime.of(2024, 4, 20, 16, 37, 10);
Period period = Period.between(star.toLocalDate(), end.toLocalDate());
System.out.println(">>> 兩個時間相差:" + period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "日");
>>> 兩個時間相差:2年1月5日
LocalDate.until
- 方法1:
Period until(ChronoLocalDate endDateExclusive);
與Period.between()
的使用相同類似,統(tǒng)計 相差幾年幾個月幾天,可參考上一個案例 - 方法2:
long until(Temporal endExclusive, TemporalUnit unit);
支持指定單位(按年或按月或按天)分別統(tǒng)計
// ChronoUnit 可選擇要計算的日期單位 年、月、日、小時、分鐘 等等
LocalDateTime star = LocalDateTime.of(2024, 3, 20, 16, 37, 10);
LocalDateTime end = LocalDateTime.of(2024, 3, 21, 16, 37, 10);
long until = star.until(end, ChronoUnit.DAYS);
System.out.println(">>> 兩個時間相差:" + until + "天");
>>> 兩個時間相差:1天
// 使用 LocalDateTime 計算相隔日期,即使差了 1分鐘 1毫秒 也不會計算1天
LocalDateTime star = LocalDateTime.of(2024, 3, 20, 16, 37, 10);
LocalDateTime end = LocalDateTime.of(2024, 3, 21, 16, 37, 9);
long until = star.until(end, ChronoUnit.DAYS);
System.out.println(">>> 兩個時間相差:" + until + "天");
>>> 兩個時間相差:0天
// 使用 LocalDate 計算相隔時差
LocalDate star = LocalDate.of(2024, 3, 20);
LocalDate end = LocalDate.of(2024, 3, 21);
long until = star.until(end, ChronoUnit.DAYS);
System.out.println(">>> 兩個時間相差:" + until + "天");
>>> 兩個時間相差:1天
Duration.between(star,end)
專業(yè)計算相隔時差,支持指定單位轉化,天 到 納秒 單位都支持
只能用 LocalDateTime
LocalDateTime star = LocalDateTime.of(2024, 3, 20, 16, 37, 10);
LocalDateTime end = LocalDateTime.of(2024, 3, 21, 16, 37, 10);
Duration duration = Duration.between(star, end);
System.out.println(">>> 兩個時間相差:" + duration.toDays() + "天");
System.out.println(">>> 兩個時間相差:" + duration.toHours() + "小時");
System.out.println(">>> 兩個時間相差:" + duration.toMinutes() + "分鐘");
System.out.println(">>> 兩個時間相差:" + duration.toMillis() + "毫秒");
System.out.println(">>> 兩個時間相差:" + duration.toNanos() + "納秒");
>>> 兩個時間相差:1天
>>> 兩個時間相差:24小時
>>> 兩個時間相差:1440分鐘
>>> 兩個時間相差:86400000毫秒
>>> 兩個時間相差:86400000000000納秒
TemporalAdjuster
TemporalAdjuster 是函數(shù)接口,在TemporalAdjusters 類中有很多預定義的實現(xiàn)。TemporalAdjuster僅有一個帶Temporal對象參數(shù)的抽象方法adjustInto()。
TemporalAdjuster可以執(zhí)行復雜的日期操作,例如,可以獲得下一個星期日對于日期、當月的最后一天、下一年的第一天。當然也可以通過舊的java.util.Calendar api實現(xiàn)。不同的是,新api使用預定義的實現(xiàn)抽象出底層邏輯。文章來源:http://www.zghlxwxcb.cn/news/detail-420544.html
TemporalAdjusters 獲取特殊(指定)時間
TemporalAdjusters類有很多預定義的static方法返回TemporalAdjuster對象,使用不同方式調(diào)節(jié)Temporal對象而與Temporal實現(xiàn)無關。文章來源地址http://www.zghlxwxcb.cn/news/detail-420544.html
// 也可以使用 LocalDateTime 帶時刻
LocalDate localDate = LocalDate.now();
// 當月第一天
localDate.with(TemporalAdjusters.firstDayOfMonth());
// 當月最后一天
localDate.with(TemporalAdjusters.lastDayOfMonth());
// 今年的第一天
localDate.with(TemporalAdjusters.firstDayOfYear());
// 今年的最后一天
localDate.with(TemporalAdjusters.lastDayOfYear());
// 下個月的第一天
localDate.with(TemporalAdjusters.firstDayOfNextMonth());
// 下一年的第一天
localDate.with(TemporalAdjusters.firstDayOfNextYear());
// 這個月的最后一個星期日
localDate.with(TemporalAdjusters.dayOfWeekInMonth(-1,DayOfWeek.SUNDAY));
// 這個月的倒數(shù)第二個星期日
localDate.with(TemporalAdjusters.dayOfWeekInMonth(-2,DayOfWeek.SUNDAY));
// 這個月的第一個星期日
localDate.with(TemporalAdjusters.dayOfWeekInMonth(-1,DayOfWeek.SUNDAY));
// 這個月的第二個星期日
localDate.with(TemporalAdjusters.dayOfWeekInMonth(-1,DayOfWeek.SUNDAY));
// 下個月的最后一個星期日
localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
// 上個星期五
localDate.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
// 上個最近的星期五,包含今天的判斷 如果今天星期五 則會返回今天日期
localDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY));
// 下個星期一
localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
// 下個最近的星期一,包含今天的判斷 如果今天是星期一 則會返回今天日期
localDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
到了這里,關于jdk1.8 LocalTime、LocalDate、LocalDateTime 使用大全的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!