1霎终、概述
Java8之前
① Java8之前有date類,date類如果不格式化可讀性十分差菩混;
② simpledateformat方法中format和parse方法都是線程不安全的撕攒,不利于使用。
Java8
① 出現(xiàn)localdate磷蛹,localdatetime吮旅,localtime這些類,使用了final來修飾味咳,使得這些類是不可變的庇勃,一旦實(shí)例化,值就固定了槽驶,所以這些類都是線程安全的责嚷;
② 全新API明確了日期時(shí)間概念,例如: 瞬時(shí)(instant) 掂铐、 長(zhǎng)短(duration) 罕拂、 日期 、 時(shí)間 全陨、 時(shí)區(qū)和周期 爆班。
2、核心類
① Instant :瞬時(shí)實(shí)例烤镐。
② LocalDate :本地日期蛋济,不包含具體時(shí)間 例如:2014-01-14 棍鳖;
③ LocalTime :本地時(shí)間炮叶,不包含日期;
④ LocalDateTime :組合了日期和時(shí)間渡处,但不包含時(shí)差和時(shí)區(qū)信息镜悉;
⑤ ZonedDateTime :最完整的日期時(shí)間,包含時(shí)區(qū)和相對(duì)UTC或格林威治的時(shí)差医瘫。
新API還引入了 ZoneOffSet 和 ZoneId 類侣肄,使得解決時(shí)區(qū)問題更為簡(jiǎn)便。解析醇份、格式化時(shí)間的 DateTimeFormatter 類也全部重新設(shè)計(jì)
3稼锅、具體使用介紹
LocalDate
LocalDate類的實(shí)例是一個(gè)不可變對(duì)象吼具,它只提供了簡(jiǎn)單的日期,并不含時(shí)間信息矩距,是不可變的和線程安全的拗盒。
API方法 | 描述 |
---|---|
now | 根據(jù)當(dāng)前時(shí)間創(chuàng)建LocalDate對(duì)象 |
of | 根據(jù)指定年月日創(chuàng)建LocalDate對(duì)象 |
getYear | 獲得年份 |
getMonthValue | 獲得月份 |
getMonth | 獲得月份枚舉值 |
getDayOfMonth | 獲得月份天數(shù)(1-31) |
getDayOfWeek | 獲得星期幾 |
getDayOfYear | 獲得年份中的第幾天(1-366) |
lengthOfYear | 獲得當(dāng)年總天數(shù) |
lengthOfMonth | 獲得當(dāng)月總天數(shù) |
toEpochDay | 與時(shí)間紀(jì)元(1970年1月1日)相差的天數(shù) |
plusDays | 加天 |
plusWeeks | 加周 |
plusMonths | 加月 |
plusYears | 加年 |
minusDays | 減年 |
minusWeeks | 減周 |
minusMonths | 減月 |
minusYears | 減年 |
withYear | 替換年份 |
withYear | 替換年份 |
withDayOfMonth | 替換日期 |
withDayOfYear | 替換日期 |
isBefore | 是否日期在之前 |
isAfter | 是否日期在之后 |
isEqual | 是否是當(dāng)前日期 |
isleapYear | 是否是閏年 |
使用介紹
//(1)獲取當(dāng)前日期 2022-07-07
System.out.println(LocalDate.now());
//(2)獲取指定日期 2000-03-05
System.out.println(LocalDate.of(2014, 3, 5));
//(3)獲取日期的年份 2022
System.out.println(LocalDate.now().getYear());
//(4)獲取日期的月份 7
System.out.println(LocalDate.now().getMonthValue());
//(5)獲取日期的日子 7
System.out.println(LocalDate.now().getDayOfMonth());
//(6)獲取日期的星期 THURSDAY
System.out.println(LocalDate.now().getDayOfWeek());
//(7)當(dāng)天所在這一年的第幾天 188
System.out.println(LocalDate.now().getDayOfYear());
//(8)獲取當(dāng)年天數(shù) 365
System.out.println(LocalDate.now().lengthOfYear());
//(9)獲取當(dāng)月天數(shù) 31
System.out.println(LocalDate.now().lengthOfMonth());
//(10)與時(shí)間紀(jì)元(1970年1月1日)相差的天數(shù),負(fù)數(shù)表示在時(shí)間紀(jì)元之前多少天 19180
System.out.println(LocalDate.now().toEpochDay());
//B.運(yùn)算
//(1)加一天
System.out.println("加1天:" + LocalDate.now().plusDays(1));
//(2)加一周
System.out.println("加1周:" + LocalDate.now().plusWeeks(1));
//(3)加一月
System.out.println("加1月:" + LocalDate.now().plusMonths(1));
//(4)加一年
System.out.println("加1年:" + LocalDate.now().plusYears(1));
//(5)減一天
System.out.println("減1天:" + LocalDate.now().minusDays(1));
//(6)減一周
System.out.println("減1周:" + LocalDate.now().minusWeeks(1));
//(7)減一月
System.out.println("減1月:" + LocalDate.now().minusMonths(1));
//(8)減一年
System.out.println("減1年:" + LocalDate.now().minusYears(1));
//C.替換
//(1)替換年份:2000-07-07
System.out.println("替換年份為2000:" + LocalDate.now().withYear(2000));
//(2)替換月份:2020-01-07
System.out.println("替換月份為1:" + LocalDate.now().withMonth(1));
//(3)替換日子:2020-07-01
System.out.println("替換日期為1:" + LocalDate.now().withDayOfMonth(1));
//(4)替換天數(shù):一年中的第多少天
System.out.println("替換天數(shù)為1:" + LocalDate.now().withDayOfYear(1));
//D.比較
//(1)是否在當(dāng)天之前
System.out.println("是否在當(dāng)天之前:" + LocalDate.now().minusDays(1).isBefore(LocalDate.now()));
//(2)是否在當(dāng)天之后
System.out.println("是否在當(dāng)天之后:" + LocalDate.now().plusDays(1).isAfter(LocalDate.now()));
//(3)是否在當(dāng)天
System.out.println("是否在當(dāng)天:" + LocalDate.now().isEqual(LocalDate.now()));
//(4)是否是閏年
System.out.println("今年是否是閏年:" + LocalDate.now().isLeapYear());
LocalDate 與 String 之間的轉(zhuǎn)換
//(1)從文本字符串獲取LocalDate實(shí)例
LocalDate localdate = LocalDate.parse("2022-04-21");
System.out.println(localdate);
//(2)使用特定格式化形式從文本字符串獲取LocalDate實(shí)例
String str = "2019-03-03";
DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(str, fmt1);
System.out.println(date);
//(3)使用特定格式化形式將LocalDate轉(zhuǎn)為字符串
LocalDate today = LocalDate.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String dateStr = today.format(fmt);
System.out.println(dateStr);
LocalDate 與 Date之間的轉(zhuǎn)換
//(1)LocalDate轉(zhuǎn)化為Date
ZonedDateTime zonedDateTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault());
Date date = Date.from(zonedDateTime.toInstant());
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
//(2)Date轉(zhuǎn)化為L(zhǎng)ocalDate
LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
LocalTime:時(shí)分秒
常用api
方法 | 描述 |
---|---|
static LocalTime now() | 獲取默認(rèn)時(shí)區(qū)的當(dāng)前時(shí)間 |
static LocalTime now(ZoneId zone) | 獲取指定時(shí)區(qū)的當(dāng)前時(shí)間 |
static LocalTime now(Clock clock) | 從指定時(shí)鐘獲取當(dāng)前時(shí)間 |
of | 根據(jù)指定的時(shí)锥债、分陡蝇、秒獲取LocalTime 實(shí)例 |
getHour | 獲取小時(shí)字段 |
getMinute | 獲取分鐘字段 |
getSecond | 獲取秒字段 |
getNano | 獲取納秒字段 |
plusHours | 增加小時(shí)數(shù) |
plusMinutes | 增加分鐘數(shù) |
plusSeconds | 增加秒數(shù) |
plusNanos | 增加納秒數(shù) |
minusHours | 減少小時(shí)數(shù) |
minusMinutes | 減少分鐘數(shù) |
minusSeconds | 減少秒數(shù) |
minusNanos | 減少納秒數(shù) |
compareTo | 時(shí)間與另一個(gè)時(shí)間比較 |
isAfter | 檢查時(shí)間是否在指定時(shí)間之后 |
isBefore | 檢查時(shí)間是否在指定時(shí)間之前 |
使用介紹
// A.獲取
//(1)獲取默認(rèn)時(shí)區(qū)的當(dāng)前時(shí)間 14:11:31.294
System.out.println(LocalTime.now());
//(2)獲取指定時(shí)區(qū)的當(dāng)前時(shí)間 14:11:31.392
System.out.println(LocalTime.now(ZoneId.of("Asia/Shanghai")));
//(3)從指定時(shí)鐘獲取當(dāng)前時(shí)間 14:11:31.392
System.out.println(LocalTime.now(Clock.systemDefaultZone()));
//(4)指定獲取時(shí)分秒
System.out.println(LocalTime.of(12, 30, 30));
//(5)指定獲取時(shí)分
System.out.println(LocalTime.of(12, 30));
//(6)指定獲取時(shí)分秒納秒
System.out.println(LocalTime.of(12, 30, 30, 123));
//(7)獲取小時(shí)字段
System.out.println("時(shí): " + LocalTime.now().getHour());
//(8)獲取分鐘字段
System.out.println("分: " + LocalTime.now().getMinute());
//(9)獲取秒字段
System.out.println("秒: " + LocalTime.now().getSecond());
//(10)獲取納秒字段
System.out.println("納秒: " + LocalTime.now().getNano());
//B.計(jì)算
//(1)增加一小時(shí)
System.out.println("增加1小時(shí): " + LocalTime.now().plusHours(1));
//(2)增加三十分鐘
System.out.println("增加30分鐘: " + LocalTime.now().plusMinutes(30));
//(3)增加三十秒
System.out.println("增加30秒: " + LocalTime.now().plusSeconds(30));
//(4)增加一萬納秒
System.out.println("增加10000納秒:" + LocalTime.now().plusNanos(10000));
//(5)減少一小時(shí)
System.out.println("減少1小時(shí): " + LocalTime.now().minusHours(1));
//(6)減少三十分鐘
System.out.println("減少30分鐘: " + LocalTime.now().minusMinutes(30));
//(7)減少三十秒
System.out.println("減少30秒: " + LocalTime.now().minusSeconds(30));
//(8)減少一萬納秒
System.out.println("減少10000納秒:" + LocalTime.now().minusNanos(10000));
//C.比較
//(1)時(shí)間與另一個(gè)時(shí)間比較 0(相等)正數(shù)(大)負(fù)數(shù)(小)
System.out.println(LocalTime.now().compareTo(LocalTime.now()));
//(2)檢查時(shí)間是否在指定時(shí)間之后
System.out.println(LocalTime.now().isAfter(LocalTime.now()));
//(3)檢查時(shí)間是否在指定時(shí)間之前
System.out.println(LocalTime.now().isBefore(LocalTime.now()));
LocalTime與 String 之間的轉(zhuǎn)換
//(1)從文本字符串獲取LocalTime實(shí)例
LocalTime localTime1 = LocalTime.parse("12:30:30");
System.out.println(localTime1);
//(2)使用特定格式化形式從文本字符串獲取LocalTime實(shí)例
LocalTime localTime2 = LocalTime.parse("12:30:30", DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println(localTime2);
//(3)使用特定格式化形式將LocalTime轉(zhuǎn)為字符串
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime localTime3 = LocalTime.now();
System.out.println(localTime3.format(df1));
LocalDateTime:年月日時(shí)分秒
方法 | 描述 |
---|---|
static LocalDateTime now() | 獲取默認(rèn)時(shí)區(qū)的當(dāng)前日期時(shí)間 |
static LocalDateTime now(Clock clock) | 從指定時(shí)鐘獲取當(dāng)前日期時(shí)間 |
static LocalDateTime now(ZoneId zone) | 獲取指定時(shí)區(qū)的當(dāng)前日期時(shí)間 |
static LocalDateTime of(LocalDate date, LocalTime time) | 根據(jù)日期和時(shí)間對(duì)象獲取 |
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) second) | 根據(jù)指定的年哮肚、月登夫、日、時(shí)允趟、分恼策、秒獲取LocalDateTime 實(shí)例 |
getYear | 獲取年份 |
getMonth | 使用月份枚舉類獲取月份 |
getDayOfMonth | 獲取日期在該月是第幾天 |
getDayOfWeek | 獲取日期是星期幾 |
getDayOfYear | 獲取日期在該年是第幾天 |
getHour | 獲取小時(shí) |
getMinute | 獲取分鐘 |
getSecond | 獲取秒 |
getNano | 獲取納秒 |
plusYears | 增加年 |
plusMonths | 增加月 |
plusWeeks | 增加周 |
plusDays | 增加天 |
plusHours | 增加小時(shí) |
plusMinutes | 增加分 |
plusSeconds | 增加秒 |
plusNanos | 增加納秒 |
minusYears | 減少年 |
minusMonths | 減少月 |
meminusWeeks | 減少周 |
minusDays | 減少天 |
minusHours | 減少小時(shí) |
minusMinutes | 減少分 |
minusSeconds | 減少秒 |
minusNanos | 減少納秒 |
isEqual | 判斷日期時(shí)間是否相等 |
isBefore | 檢查是否在指定日期時(shí)間之前 |
isAfter | 檢查是否在指定日期時(shí)間之后 |
LocalDateTime與 String 之間的轉(zhuǎn)換
//(1)獲取日期部分
System.out.println(LocalDateTime.now().toLocalDate());
//(2)獲取時(shí)間部分:時(shí)、分潮剪、秒
System.out.println(LocalDateTime.now().toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")));
//(3)從文本字符串獲取LocalDateTime實(shí)例
LocalDateTime ldt2 = LocalDateTime.parse("2019-12-07T21:20:06.303995200");
System.out.println(ldt2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//(4)使用特定格式化形式從文本字符串獲取LocalDateTime實(shí)例
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt3 = LocalDateTime.parse("2019-12-07 21:20:06", df1);
System.out.println(ldt3);
//(5)使用特定格式化形式將LocalDateTime轉(zhuǎn)為字符串
String ldt4 = df1.format(ldt3);
System.out.println(ldt4);
LocalDateTime與 Date之間的轉(zhuǎn)換
//(1)LocalDateTime轉(zhuǎn)化為Date
ZonedDateTime zdt = LocalDateTime.now().atZone(ZoneId.systemDefault());
Date date1 = Date.from(zdt.toInstant());
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date1));
//(2)Date轉(zhuǎn)化為L(zhǎng)ocalDateTime
LocalDateTime localDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));