最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

JAVA8時(shí)間處理類全解

2023-07-04 15:20 作者:啥玩意你再說一遍  | 我要投稿

https://docs.oracle.com/javase/8/docs/api/

LocalDate(日期)+ LocalTime(時(shí)間) = LocalDateTime

ZoneOffset(時(shí)差) + LocalDateTime(日期時(shí)間) + ZoneId(時(shí)區(qū)) = ZonedDateTime

ZoneOffset(時(shí)差) + LocalDateTime(日期時(shí)間) = OffsetDateTime

Pried(較長時(shí)間) Duration(較短時(shí)間) Instant Clock MonthDay

LocalDate

//獲取當(dāng)前日期
//不包含時(shí)區(qū)、時(shí)分秒信息
//輸入結(jié)果為標(biāo)準(zhǔn)的yyyy-MM-dd格式
System.out.println(LocalDate.now());
//獲取特定日期
System.out.println(LocalDate.of(1994,3,22));
System.out.println(LocalDate.of(1994, Month.MARCH, 22));
//獲取時(shí)間分量
LocalDate now = LocalDate.now();
//年月日
int year1 = now.getYear();
int year2 = now.get(ChronoField.YEAR);
System.out.println(year2);
//year的范圍 不存在公元0年 LocalDate中0表示公元-1年,-1表示公元-2年...
System.out.println(now.range(ChronoField.YEAR));
//當(dāng)月的天數(shù)
System.out.println(now.range(ChronoField.DAY_OF_MONTH));
Month month = now.getMonth();
int monthValue = now.getMonthValue();
System.out.println("MONTH_OF_YEAR:" + now.get(ChronoField.MONTH_OF_YEAR));
int dayOfYear = now.getDayOfYear();
int dayOfMonth = now.getDayOfMonth();
DayOfWeek dayOfWeek = now.getDayOfWeek();
//1為每周的第一天
System.out.println(now.getDayOfWeek().getValue());
System.out.println(year1 + " " + month + " " + monthValue + " "+ dayOfYear + " " + dayOfMonth + " " +dayOfWeek);
//獲取當(dāng)月的天數(shù)
System.out.println(now.lengthOfMonth());
//獲取當(dāng)年的天數(shù)
System.out.println(now.lengthOfYear());
//判斷是否為閏年
System.out.println(now.isLeapYear());
//判斷是公元年前還是公元后
System.out.println(now.getEra());
//計(jì)算當(dāng)日與1970-01-01相差的天數(shù)
System.out.println(now.toEpochDay());
//計(jì)算與公元0年(公元前1年)相差的天數(shù)
System.out.println(now.getLong(ChronoField.PROLEPTIC_MONTH));
//LocalDate并不是支持所有的時(shí)間分量枚舉值 可以用now.isSupported()判斷
System.out.println(now.isSupported(ChronoField.PROLEPTIC_MONTH));
//時(shí)間分量的修改
//修改月份 LocalDate是不可變量 修改后需要用新的變量引用
LocalDate now1 = LocalDate.now();
LocalDate localDate = now1.withMonth(8);
System.out.println(localDate);
//修改年/月/日為指定的數(shù)字
System.out.println(now1.with(ChronoField.MONTH_OF_YEAR, 2));
//增加時(shí)間(減少也有相對應(yīng)的方法)
LocalDate data = LocalDate.now();
//plusXXX()可以填正數(shù)也可以填負(fù)數(shù) 假如data為閏年2月29日,+-一年后為2月28日
System.out.println(data.plusYears(1));
System.out.println(data.plusYears(-1));
System.out.println(data.plus(1, ChronoUnit.YEARS));
//增加一段時(shí)間 比如增加1年2個(gè)月3天 Period也可以傳負(fù)數(shù)
Period period = Period.of(1,2,3);
System.out.println(data.plus(period));
//時(shí)間比較
LocalDate date = LocalDate.of(2022, 3, 24);
//相同歷法時(shí)間比較是否相等
System.out.println(data.equals(date));
HijrahDate hijrahDate = HijrahDate.of(1430, 6, 27);
//不同歷法時(shí)間比較是否相等
System.out.println(hijrahDate.isEqual(date));
//比較日期前后關(guān)系 可以比較不同歷法
System.out.println(data.isAfter(date));
System.out.println(data.isBefore(date));
//明確時(shí)間早晚是否相等compareTo() 返回值不能代表具體相差的年份/月份/天數(shù)
System.out.println(data.compareTo(date));
//計(jì)算時(shí)間差
//計(jì)算兩個(gè)日期相差的天數(shù) 通過計(jì)算兩個(gè)日期和1970-01-01日相差的天數(shù) 再拿天數(shù)差計(jì)算得到兩個(gè)日期相差的天數(shù)
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2021, 1, 3);
long l1 = date1.toEpochDay();
long l2 = date2.toEpochDay();
System.out.println(l2 - l1);
//通過until(var 1, var2)方法 可以計(jì)算相差的天、年、月
System.out.println(date1.until(date2, ChronoUnit.YEARS));
System.out.println(date1.until(date2, ChronoUnit.MONTHS));
System.out.println(date1.until(date2, ChronoUnit.DAYS));
//通過until()方法 返回Period類對象 PXYXMXD 相差X年X月X天
System.out.println(date2.until(date1));
//得到兩個(gè)日期相差的所有的日期 datesUntil() 存在重載方法設(shè)置步長
Stream<LocalDate> dates = date1.datesUntil(date2, Period.ofDays(2));
Object[] array = dates.toArray();
for(int i=0; i<array.length; ++i){
System.out.println((LocalDate)array[i]);
}
//月日的類 類似的類有YearMonth
MonthDay fromMD = MonthDay.from(date1);
MonthDay ofMD = MonthDay.of(date1.getMonth(), date1.getDayOfMonth());
System.out.println(fromMD.compareTo(ofMD));
//為MonthDay添加年 變?yōu)長ocalDate對象
LocalDate localDate = ofMD.atYear(2022);
System.out.println(localDate);

LocalTime

//LocaleTime可以記錄時(shí)分秒納秒 不包含時(shí)區(qū)
//創(chuàng)建一個(gè)LocalTime對象 默認(rèn)精確到毫秒
System.out.println(LocalTime.now());//09:09:36.742
//of()方法有四個(gè)參數(shù) 時(shí)、分、秒、納秒 沒有毫秒
System.out.println(LocalTime.of(7, 15));//07:15
//按照一天當(dāng)中第多少秒創(chuàng)建時(shí)間 同樣的方法有ofNanoOfDay()
System.out.println(LocalTime.ofSecondOfDay(10000));//02:46:40
//靜態(tài)屬性 NOON表示正午時(shí)間 類似屬性MIN MAX MIDNIGHT
System.out.println(LocalTime.NOON);//12:00
//獲得LocalTime時(shí)間分量
LocalTime localTime = LocalTime.now();
//獲得小時(shí)
System.out.println(localTime.getHour());
//獲得分鐘
System.out.println(localTime.getMinute());
//獲得秒鐘
System.out.println(localTime.getSecond());
//獲得一天當(dāng)中現(xiàn)在的秒數(shù)
System.out.println(localTime.toSecondOfDay());
//獲得納秒
System.out.println(localTime.getNano());
//獲得一天當(dāng)中現(xiàn)在的納秒數(shù)
System.out.println(localTime.toNanoOfDay());
//獲得現(xiàn)在的毫秒數(shù)
System.out.println(localTime.get(ChronoField.MILLI_OF_SECOND));
/**
* 其他的枚舉值:
* AMPM_OF_DAY 前半天還是后半天。0-11點(diǎn)位前半天,顯示為0;12-23為后半天,顯示1。
* HOUR_OF_AMPM 把24小時(shí)為周期的點(diǎn)數(shù)轉(zhuǎn)換為12小時(shí)為周期,比如16點(diǎn),就會(huì)表示為4(范圍為0-11)
* CLOCK_HOUR_OF_AMPM 把24小時(shí)為周期的點(diǎn)數(shù)轉(zhuǎn)換為12小時(shí)為周期,比如16點(diǎn),就會(huì)表示為4(范圍為1-12)
* HOUR_OF_DAY 以24小時(shí)為周期的小時(shí)數(shù)(范圍0-23)
* CLOCK_HOUR_OF_DAY 以24小時(shí)為周期的小時(shí)數(shù)(范圍為1-24)
*/
//修改時(shí)間分量類比LocalDate
//抹去零頭
System.out.println(localTime.truncatedTo(ChronoUnit.SECONDS));//11:34:57
System.out.println(localTime.truncatedTo(ChronoUnit.MINUTES));//11:35
//時(shí)間的比較
/**
* 類比LocalDate類
* equals():比較兩個(gè)日期是否是同一天,LocalTime沒有isEqual()方法。
* isBefore():判斷參數(shù)對象是否早于自身出現(xiàn)
* isAfter():判斷參數(shù)對象是否晚于自身出現(xiàn)
* compareTo():確定兩個(gè)對象之間的早晚關(guān)系(僅有-1、0、1三個(gè)返回值)
* 計(jì)算兩個(gè)LocalTime之間的時(shí)間差
* 使用until()方法,由第2個(gè)參數(shù)指定時(shí)間差的表示單位。
*/

LocalDateTime

//LocalDate + LocatTime = LocalDateTime
//創(chuàng)建對象now() of()
LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.of(ld, lt);
System.out.println(localDateTime);//2022-09-23T13:55:26.429
//獲得時(shí)間分量 參考LocalDate和LocalTime
//LocalDateTime類中定義了toLocalDate()和toLocalTime()兩個(gè)方法,
//這兩個(gè)方法分別用來獲得一個(gè)LocalDateTime對象的日期部分和時(shí)間部分
//比較兩個(gè)時(shí)間 參考LocalDate和LocalTime
//計(jì)算兩個(gè)參數(shù)的時(shí)差until() 該方法的第1個(gè)參數(shù)可以是LocalDateTime類對象,
//也可以是ZonedDateTime類對象

Period

表示以年月日為計(jì)時(shí)單位的時(shí)間段

//以構(gòu)造的方式創(chuàng)建對象
/**
* 以構(gòu)造方式創(chuàng)建出的Period對象,除了星期會(huì)被自動(dòng)轉(zhuǎn)換為天以外,
* 年月日之間不會(huì)自動(dòng)完成轉(zhuǎn)換操作。
* 無法計(jì)算出一個(gè)Period對象具體有多少天。
*/
Period period1 = Period.of(1, 2, 3);
System.out.println(period1);//P1Y2M3D
Period period2 = Period.ofWeeks(3);
System.out.println(period2);//P21D
//以計(jì)算的方式計(jì)算Period對象
LocalDate l1 = LocalDate.of(2022, 8, 23);
LocalDate l2 = LocalDate.now();
//until()
Period between = Period.between(l1, l2);
System.out.println(between);
//獲得Period的所有計(jì)數(shù)器
List<TemporalUnit> units = between.getUnits();
for(int i=0; i<units.size(); ++i){
System.out.println(units.get(i));//Years Months Days
}
//獲得相差時(shí)期中的年
System.out.println(between.get(ChronoUnit.YEARS));//2
//獲得相差的總月數(shù)
System.out.println(between.toTotalMonths());//25
//Period類常用方法
/**
* withYears()/withMonths()/withDays() 修改年/月/日計(jì)數(shù)器上的值
* plusYears()/plusMonths()/plusDays()/plus() 增加年/月/日計(jì)數(shù)器上的值
* minusYears()/minusMonths()/minusDays()/minus() 減少年/月/日計(jì)數(shù)器上的值
* normalized() 規(guī)范化時(shí)間段格式
* negated() 反轉(zhuǎn)各計(jì)數(shù)器的值
* multipliedBy() 各個(gè)計(jì)數(shù)器的值倍增
* addTo() 以某個(gè)日期為基礎(chǔ)向后推一段時(shí)間
* subtractFrom() 以某個(gè)日期為基礎(chǔ)向前推一段時(shí)間
* equals() 判斷兩個(gè)Period對象是否相等
* isZero() 判斷Period對象是否為0
* isNegative() 判斷Period對象是否為負(fù)
*/
Period p1 = Period.of(3, 34, 12);
Period p2 = Period.of(3, -34, 12);
System.out.println(p1.normalized());//P5Y10M12D
System.out.println(p2.normalized());//P2M12D
System.out.println(p1.negated());//P-3Y-34M-12D
System.out.println(p2.multipliedBy(2));//P6Y-68M24D

Duration

表示以秒和納秒為計(jì)時(shí)單位的時(shí)間段,相對于Period來講,它更加精確。

Duration類中內(nèi)置了秒和納秒兩個(gè)計(jì)數(shù)器,其中納秒計(jì)數(shù)器的合法數(shù)值范圍是0-999999999,不能為負(fù)數(shù)。

雖然納秒計(jì)數(shù)器上的值不能為負(fù)數(shù),但是在使用of()方法創(chuàng)建Duration對象的時(shí)候,卻可以給表示納秒的參數(shù)傳遞負(fù)數(shù),在實(shí)際創(chuàng)建對象過程中,虛擬機(jī)會(huì)從秒計(jì)數(shù)器上借1秒修正納秒計(jì)數(shù)器上的值為正值。

雖然Duration類只有秒和納秒兩個(gè)計(jì)數(shù)器,但其對象被打印出來卻是以“時(shí)分秒”的格式來展現(xiàn)的。

//以構(gòu)造方式創(chuàng)建Duration對象
Duration duration = Duration.ofSeconds(3, -2000);
System.out.println(duration);//PT2.999998S
System.out.println(duration.getNano());//999998000
Duration d1 = Duration.ofSeconds(300000, -2000);
System.out.println(d1);//PT83H19M59.999998S
//以計(jì)算方式創(chuàng)建Duration對象
LocalTime lt1 = LocalTime.of(1, 13);
LocalTime lt2 = LocalTime.of(2, 16);
Duration between = Duration.between(lt1, lt2);
System.out.println(between);//PT1H3M
/**
* Duration類常用方法
* getNano() 獲得納秒計(jì)數(shù)器的值
* getSeconds() 獲得秒計(jì)數(shù)器的值
* get(TemporalUnit unit)獲得指定計(jì)數(shù)器的值,獲得不存在計(jì)數(shù)器的值將會(huì)拋出異常。
* toDays() 計(jì)算時(shí)間段中包含多少天
* toDaysPart() 以天為單位計(jì)算時(shí)間段零頭部分,因?yàn)樵贒uration類中不存在比Day更大的時(shí)間單位,
* 所以該方法和toDays()方法一樣。
* toHours() 計(jì)算時(shí)間段中包含多少小時(shí)
* toHoursPart() 以小時(shí)為單位計(jì)算時(shí)間段零頭部分
* truncatedTo() 抹去零頭
* ......
*/
/**
* Duration類在調(diào)用toXXX()方法時(shí),如果計(jì)算秒或者比秒更大的時(shí)間單位,忽略納秒計(jì)數(shù)器上的值,
* 而計(jì)算比秒更小的時(shí)間單位時(shí),納秒計(jì)數(shù)器上的值也要參與運(yùn)算。
*/
/**
* 修改時(shí)間分量
* withSeconds() 直接修改對象秒計(jì)數(shù)器的值
* withNanos() 直接修改對象納秒計(jì)數(shù)器的值(范圍0-999999999)
* plusDays()/minusDays() 給時(shí)間段增加/減少指定的天數(shù)
* plusHours()/minusHours() 給時(shí)間段增加/減少指定的小時(shí)數(shù)
* plusMinutes()/minusMinutes() 給時(shí)間段增加/減少指定的分鐘數(shù)
* plusSeconds()/minusSeconds() 給時(shí)間段增加/減少指定的秒數(shù)
* plusMillis()/minusMillis() 給時(shí)間段增加/減少指定的毫秒數(shù)
* ......
*/

ZoneId與ZoneOffset

ZoneId:

1.既可以表示時(shí)區(qū),也可以表示時(shí)差。

2.是一個(gè)抽象類,有兩個(gè)子類分別是ZoneRegion和ZoneOffset,ZoneRegion表示城市或地區(qū),并以城市或地區(qū)反映“時(shí)區(qū)”。

//通過systemDefault()創(chuàng)建
ZoneId zoneId1 = ZoneId.systemDefault();
System.out.println(zoneId1.getClass());//class java.time.ZoneRegion
System.out.println(zoneId1);//Asia/Shanghai
System.out.println(zoneId1.normalized());//Asia/Shanghai
System.out.println(zoneId1.getRules());//ZoneRules[currentStandardOffset=+08:00]
//通過靜態(tài)方法of()創(chuàng)建
ZoneId zoneId2 = ZoneId.of("Asia/Shanghai");
System.out.println(zoneId2);
//所有的代表時(shí)區(qū)的地區(qū)
for(String s : ZoneId.getAvailableZoneIds()){
System.out.println(s);
}
ZoneId ctt = ZoneId.of("CTT", ZoneId.SHORT_IDS);
System.out.println(ctt);

ZoneOffset:

1.時(shí)差,特指與格林尼治時(shí)間的偏差。

ZoneId zoneId = ZoneId.of("UTC+08:00");
ZoneId zoneId = ZoneId.of("+08:00");
System.out.println(zoneId.getClass());//class java.time.ZoneOffset
System.out.println(zoneId);//+08:00
ZoneId zoneId1 = ZoneId.of("+08:23");
System.out.println(zoneId1);//+08:23
//中時(shí)區(qū)/零時(shí)區(qū)
ZoneId zoneId2 = ZoneId.of("+00:00");
System.out.println(zoneId2);//Z
/**
* GMT
* 1.全稱為Greenwich Mean Time,意為格林尼治時(shí)間
* 2.格林尼治天文臺(tái)所在的那個(gè)時(shí)區(qū)的時(shí)間
* 3.由格林尼治天文臺(tái)根據(jù)觀測地球自轉(zhuǎn)所確定的時(shí)間系統(tǒng)
* UTC
* 1.中文譯為協(xié)調(diào)世界時(shí),又稱世界統(tǒng)一時(shí)間。
* 2.UTC是以原子時(shí)秒長為基礎(chǔ),在時(shí)刻上盡量接近于世界時(shí)的一種時(shí)間計(jì)量系統(tǒng)。
* Java8新日期時(shí)間系統(tǒng)中,GMT與UTC并無數(shù)值上的差別。
* 閏秒:UTC和GMT相差1秒,調(diào)整UTC與GMT相等。
*/
//不可以加UTC/GMT
ZoneOffset zoneOffset = ZoneOffset.of("+08:00");
System.out.println(zoneOffset);//+08:00
//三個(gè)屬性的正負(fù)值必須保持一致
ZoneOffset zoneOffset1 = ZoneOffset.ofHoursMinutesSeconds(3, 12, 1);
System.out.println(zoneOffset1);//+03:12:01
System.out.println(zoneOffset1.getTotalSeconds());//11521
System.out.println(zoneOffset1.get(ChronoField.OFFSET_SECONDS));//11521
System.out.println(ZoneOffset.ofHours(8));//+08:00

ZonedDateTime與OffsetDateTime

ZonedDateTime

LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
ZoneOffset zoneOffset = ZoneOffset.ofHours(8);
//此時(shí)時(shí)區(qū)為系統(tǒng)設(shè)置的時(shí)區(qū)
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);//2022-09-23T20:14:43.776+08:00[Asia/Shanghai]
//of()方法只組合不轉(zhuǎn)換 時(shí)間不會(huì)轉(zhuǎn)換成指定時(shí)區(qū)的時(shí)間 還是系統(tǒng)的LocalDateTime
ZonedDateTime zonedDateTime1 = ZonedDateTime.of(localDateTime, zoneId);
System.out.println(zonedDateTime1);//2022-09-23T20:18:03.987+09:00[Asia/Tokyo]
Instant instant = Instant.now();
System.out.println(instant);//2022-09-24T03:08:11.849Z
//組合轉(zhuǎn)換 轉(zhuǎn)向ZoneId
ZonedDateTime zonedDateTime2 = ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(zonedDateTime2);//2022-09-24T12:08:11.849+09:00[Asia/Tokyo]
ZoneOffset zoneOffset1 = ZoneOffset.of("+06:00");
ZonedDateTime zonedDateTime3 = ZonedDateTime.ofInstant(localDateTime, zoneOffset1, zoneId);//2022-09-24T14:14:14.663+09:00[Asia/Tokyo]
System.out.println(zonedDateTime3);
//ofStrict() ZoneOffset與ZoneId必須嚴(yán)格一致 只組合不轉(zhuǎn)換
System.out.println(ZonedDateTime.ofStrict(localDateTime, ZoneOffset.of("+08:00"), ZoneId.of("Asia/Shanghai")));//2022-09-24T11:18:47.899+08:00[Asia/Shanghai]

OffsetDateTime

//now方法創(chuàng)建
OffsetDateTime offsetDateTime = OffsetDateTime.now();
System.out.println(offsetDateTime);//2022-09-24T11:23:41.488+08:00
//of()方法創(chuàng)建
LocalDateTime localDateTime = LocalDateTime.now();
ZoneOffset zoneOffset = ZoneOffset.of("+09:00");
OffsetDateTime offsetDateTime1 = OffsetDateTime.of(localDateTime, zoneOffset);
//只組合不轉(zhuǎn)換
System.out.println(offsetDateTime1);//2022-09-24T11:26:39.355+09:00
//ofInstant() 轉(zhuǎn)向ZoneId
Instant instant = Instant.now();
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
OffsetDateTime offsetDateTime2 = OffsetDateTime.ofInstant(instant, zoneId);
System.out.println(offsetDateTime2);//2022-09-24T12:30:21.634+09:00

ZonedDateTime與OffsetDateTime計(jì)算

//獲得時(shí)間分量
ZonedDateTime zonedDateTime = ZonedDateTime.now();
OffsetDateTime offsetDateTime3 = OffsetDateTime.now();
ZoneOffset offset = zonedDateTime.getOffset();
System.out.println(offset);
//與格林尼治時(shí)區(qū)相差的總秒數(shù)
System.out.println(offset.getTotalSeconds());
System.out.println(zonedDateTime.get(ChronoField.OFFSET_SECONDS));
//當(dāng)前系統(tǒng)時(shí)間與時(shí)間源點(diǎn)(1970-01-01 00:00:00)相差的總秒數(shù)
System.out.println(zonedDateTime.getLong(ChronoField.INSTANT_SECONDS));
System.out.println(offsetDateTime3.toEpochSecond());
System.out.println(zonedDateTime.toEpochSecond());
//query()
ZonedDateTime zonedDateTime1 = ZonedDateTime.now();
LocalDate query = zonedDateTime1.query(TemporalQueries.localDate());//2022-09-26
System.out.println(query);
LocalTime query1 = zonedDateTime1.query(TemporalQueries.localTime());//08:46:17.405
System.out.println(query1);
//時(shí)差
ZoneOffset query2 = zonedDateTime1.query(TemporalQueries.offset());
System.out.println(query2);//+08:00
ZoneId query3 = zonedDateTime1.query(TemporalQueries.zoneId());
System.out.println(query3);//Asia/Shanghai
//獲得紀(jì)年方式
Chronology query4 = zonedDateTime1.query(TemporalQueries.chronology());
System.out.println(query4);//ISO
//對象最高精度的計(jì)時(shí)單位
TemporalUnit query5 = zonedDateTime1.query(TemporalQueries.precision());
System.out.println(query5);//Nanos
//修改時(shí)差信息
ZonedDateTime zonedDateTime2 = ZonedDateTime.now();
OffsetDateTime offsetDateTime4 = OffsetDateTime.now();
ZoneId zoneId1 = ZoneId.of("Asia/Tokyo");
System.out.println(zonedDateTime2);//2022-09-26T09:14:57.025+08:00[Asia/Shanghai]
//修改時(shí)區(qū) 日期時(shí)間不變
System.out.println(zonedDateTime2.withZoneSameLocal(zoneId1));//2022-09-26T09:21:32.398+09:00[Asia/Tokyo]
//修改時(shí)區(qū)和時(shí)間
System.out.println(zonedDateTime2.withZoneSameInstant(zoneId1));//2022-09-26T10:22:48.353+09:00[Asia/Tokyo]
System.out.println(zonedDateTime2.withFixedOffsetZone());//2022-09-26T09:28:39.251+08:00
//日期時(shí)間比較
LocalDateTime localDateTime1 = LocalDateTime.now();
ZoneId zoneId2 = ZoneId.of("Asia/Shanghai");
ZoneId zoneId3 = ZoneId.of("+08:00");
ZonedDateTime zonedDateTime3 = ZonedDateTime.of(localDateTime1, zoneId2);
ZonedDateTime zonedDateTime4 = ZonedDateTime.of(localDateTime1, zoneId3);
System.out.println(zonedDateTime3.equals(zonedDateTime4));//false
System.out.println(zonedDateTime3.isEqual(zonedDateTime4));//true
//ZonedDateTime和OffsetDateTime比較需要轉(zhuǎn)化為同一個(gè)類型
//不能用ZonedDateTime和OffsetDateTime的compareTo()方法比較兩個(gè)時(shí)間在時(shí)間軸上的前后關(guān)系
//可以使用OffsetDateTime.timeLineOrder.compare()來比較 只能比較OffsetDateTime對象 比較ZonedDateTime需要轉(zhuǎn)化
//計(jì)算時(shí)間差until()方法

格式化日期時(shí)間DateTimeFormatter

ZonedDateTime zonedDateTime5 = ZonedDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String format = zonedDateTime5.format(dateTimeFormatter);
System.out.println(format);//2022年09月26日
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EEEE");
String format1 = zonedDateTime5.format(dateTimeFormatter1);
System.out.println(format1);//2022年09月26日 星期一
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 xxx");
String format2 = zonedDateTime5.format(dateTimeFormatter2);
System.out.println(format2);//2022年09月26日 +08:00
//DateTimeFormatter也提供了很多靜態(tài)格式
String str = "2022年09月26日";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate ld = LocalDate.parse(str, dtf);
System.out.println(ld);//2022-09-26

Clock

當(dāng)前時(shí)刻

1.抽象類,用于獲取當(dāng)前時(shí)間,可以代替System.currentTimeMillis()和TimeZone.getDefault()。Clock類對象記錄當(dāng)前時(shí)間時(shí),并沒有記錄具體的年月日和時(shí)分秒,而是記錄了當(dāng)前時(shí)間距離時(shí)間原點(diǎn)的毫秒數(shù),同時(shí)還記錄了一個(gè)時(shí)區(qū)信息,這樣就能把Clock對象轉(zhuǎn)換成各種日期時(shí)間類的對象。

2.該抽象類的主要目的是允許在需要時(shí)插入備用時(shí)鐘,所有時(shí)間類都有一個(gè)now()工廠方法,該方法使用默認(rèn)時(shí)區(qū)中的系統(tǒng)時(shí)鐘,最佳實(shí)踐是將Clock傳遞給任何需要當(dāng)前時(shí)間的方法。

3.保證線程安全

4.忽略閏秒

5.繼承的類要聲明Serializable

Clock clock = Clock.systemDefaultZone();
System.out.println(clock);//SystemClock[Asia/Shanghai]
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
Clock system = Clock.system(zoneId);
System.out.println(system);//SystemClock[Asia/Tokyo]
Clock systemUTC = Clock.systemUTC();
System.out.println(systemUTC);//SystemClock[Z]
//當(dāng)前時(shí)間與時(shí)間原點(diǎn)相差的毫秒數(shù)
System.out.println(systemUTC.millis());//1664158760710
System.out.println(clock.getZone());//Asia/Shanghai
//修改時(shí)區(qū)
Clock clock1 = clock.withZone(zoneId);
System.out.println(clock1);//SystemClock[Asia/Tokyo]
//給當(dāng)前時(shí)間增加一段時(shí)間
Clock offset = Clock.offset(clock, Duration.ofHours(24));
/**
* tickSeconds()方法的作用:創(chuàng)建一個(gè)表示當(dāng)前時(shí)刻的Clock對象,
* 但該對象計(jì)時(shí)只能精確到秒
*/
//以5個(gè)小時(shí)為精度
Clock tick = Clock.tick(clock, Duration.ofHours(5));

Instant

1.表示時(shí)間軸上的任意一個(gè)時(shí)間點(diǎn)

2.沒有時(shí)區(qū)信息

3.記錄時(shí)間最小可精確到納秒

4.Instant對象中并不能直接得到年月日時(shí)分秒的數(shù)值,它靠秒計(jì)數(shù)器和納秒計(jì)數(shù)器來記錄與時(shí)間原點(diǎn)的距離

Instant now = Instant.now();
System.out.println(now);//2022-09-26T02:34:15.034Z
//創(chuàng)建距離創(chuàng)建時(shí)間原點(diǎn)123456789毫秒的時(shí)間
Instant instant = Instant.ofEpochMilli(123456789);
System.out.println(instant);//1970-01-02T10:17:36.789Z
//修改時(shí)間分量 plus() minus()
System.out.println(now.plus((Period.ofDays(3))));//2022-09-29T02:47:21.628Z
/**
* LocalDate僅可接受Period對象
* LocalTime僅可接受Duration對象
* LocalDateTime/ZonedDateTime/OffsetDateTime既可接受Period對象又可接受Duration對象
* Instant可以完全接受Duration對象,在Period對象年和月計(jì)數(shù)器值為0的情況下,也可以接收Period對象作為參數(shù)。
*/
System.out.println(now.plus(1, ChronoUnit.DAYS));//2022-09-27T02:53:23.827Z
Instant instant1 = Instant.ofEpochMilli(0);
//賦值now
System.out.println(instant1.with(now));
/**
* 常用的方法
* equals() isBefore() isAfter() compareTo() until()
*/

now()方法詳解

/**
* now()方法:1.無參 2.Clock對象 3.ZoneId
* now()方法所創(chuàng)建的日期時(shí)間對象實(shí)際取決于Clock參數(shù)
*/

ChronoField.XXX

代表時(shí)間分量

ChronoUnit.XXX

代表時(shí)長

對象直接互相轉(zhuǎn)化

加法型 減法型 平行轉(zhuǎn)換型 部分轉(zhuǎn)換型


JAVA8時(shí)間處理類全解的評論 (共 條)

分享到微博請遵守國家法律
株洲县| 乌鲁木齐县| 澎湖县| 万州区| 宜春市| 诏安县| 宁城县| 增城市| 精河县| 苏尼特右旗| 长兴县| 苍梧县| 仲巴县| 神池县| 中山市| 平罗县| 云梦县| 黄陵县| 临江市| 台前县| 都兰县| 台中市| 昌都县| 榆树市| 凯里市| 嘉荫县| 突泉县| 香河县| 珲春市| 阳山县| 滨州市| 龙口市| 富锦市| 冕宁县| 奉节县| 杨浦区| 炎陵县| 大渡口区| 兴城市| 博罗县| 水富县|