時間戳與LocalDateTime互轉(zhuǎn)
2.1 LocalDateTime 轉(zhuǎn) 時間戳
方式一
這邊值得一提的是在中國的時區(qū)偏移是8小時描验,本次示例轉(zhuǎn)的時間戳是秒級別白嘁,得到的值是一個long值;知識追尋者這邊是當(dāng)前時間膘流,故讀者得到的結(jié)果與知識追尋者得到的結(jié)果不一致絮缅;讀者可以使用站長工具進(jìn)行測試校驗(yàn)
@Test
public void localTimeTest1(){
// 獲得當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 將當(dāng)前時間轉(zhuǎn)為時間戳
long second = localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
// 1580706475
System.out.println(second);
}
方式二
此方法執(zhí)行的結(jié)果與之前一致,也是秒級別
@Test
public void localTimeTest2(){
// 獲得當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 將當(dāng)前時間轉(zhuǎn)為時間戳
long second = localDateTime.toInstant(ZoneOffset.ofHours(8)).getEpochSecond();
// 1580707001
System.out.println(second);
}
方式三
此方式轉(zhuǎn)的將是毫秒級別睡扬,直接用于站長工具是測試不出來盟蚣,讀者應(yīng)該將其除1000取商獲得正確的秒級時間戳;
@Test
public void localTimeTest3(){
// 獲得當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 將當(dāng)前時間轉(zhuǎn)為時間戳
long milliseconds = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
// 1580707268
System.out.println(milliseconds/1000);
}
2.2 時間戳 轉(zhuǎn)LocalDateTime
以下幾種獲取的LocalDateTime方式按讀者需求進(jìn)行獲取卖怜,不同的精確值屎开,將獲取不同的結(jié)果;
方式一
先獲取時間戳為秒級別马靠,然后通過轉(zhuǎn)換為LocalDateTime
@Test
public void localTimeTest4(){
//獲得時間戳
long second = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).getEpochSecond();
// 將時間戳轉(zhuǎn)為當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(second, 0, ZoneOffset.ofHours(8));
// 2020-02-03T13:30:44
System.out.println(localDateTime);
}
方式二
本次獲取的時間搓將是毫秒級別故要除以1000
public void localTimeTest5(){
//獲得時間戳
long milliseconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
// 將時間戳轉(zhuǎn)為當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(milliseconds/1000, 0, ZoneOffset.ofHours(8));
// 2020-02-03T13:35:53
System.out.println(localDateTime);
}
方式三
本方式精確值是毫秒級別奄抽,故得到的結(jié)果會存在三位小數(shù)點(diǎn)蔼两;
@Test
public void localTimeTest6(){
//獲得時間戳
long milliseconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
// 將時間戳轉(zhuǎn)為當(dāng)前時間
LocalDateTime localDateTime = Instant.ofEpochMilli(milliseconds).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
// 2020-02-03T13:38:35.799
System.out.println(localDateTime);
}
三 時間戳與LocalDate互轉(zhuǎn)
學(xué)會時間戳與LocalDate互轉(zhuǎn),同理就可以推出時間戳與LocalTime 互轉(zhuǎn)逞度,不過知識追尋者相信幾乎沒人會用到這個额划,故這邊就不做示例;
3.1 時間戳轉(zhuǎn)LocalDate
方式一
注意這邊是毫秒級的時間戳;
@Test
public void localDateTest1(){
//獲得時間戳
long milliseconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
// 將時間戳轉(zhuǎn)為當(dāng)前時間
LocalDate localDate = Instant.ofEpochMilli(milliseconds).atZone(ZoneOffset.ofHours(8)).toLocalDate();
// 2020-02-03
System.out.println(localDate);
}
方式二
注意這邊是秒級時間戳
@Test
public void localDateTest2(){
//獲得時間戳
long seconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).getEpochSecond();
// 將時間戳轉(zhuǎn)為當(dāng)前時間
LocalDate localDate = Instant.ofEpochSecond(seconds).atZone(ZoneOffset.ofHours(8)).toLocalDate();
// 2020-02-03
System.out.println(localDate);
}
3.2 LocalDate 轉(zhuǎn) 時間戳
方式一
注意妙計(jì)時間戳
@Test
public void localDateTest3(){
LocalDate localDate = LocalDate.now();
//獲得時間戳
long seconds = localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().getEpochSecond();
// 1580659200
System.out.println(seconds);
}
方式二
注意毫秒級時間戳
@Test
public void localDateTest4(){
LocalDate localDate = LocalDate.now();
//獲得時間戳
long seconds = localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
// 1580659200000
System.out.println(seconds);
}
四 LocalDateTime與Date互轉(zhuǎn)
4.1 Date轉(zhuǎn)LocalDateTime
注意避坑,如下代碼汉柒,執(zhí)行完畢杨何,可以看出會有時間誤差8小時的區(qū)別
public static void main(String[] args) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String zhi="2022-11-02 00:00:00";
Date date=dateFormat.parse(zhi);
System.out.println(date);
LocalDateTime dateTime=LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC);
System.out.println("一個"+dateTime);
LocalDateTime dateTime1=Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
System.out.println("這個"+dateTime1);
LocalDateTime dateTime2=date.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println("又是"+dateTime2);
}
輸出結(jié)果:
Wed Nov 02 00:00:00 CST 2022
一個2022-11-01T16:00
這個2022-11-01T16:00
又是2022-11-02T00:00
方式一
得出結(jié)果是有小數(shù)點(diǎn)忧勿,毫秒級精確
@Test
public void DateTest1(){
// 創(chuàng)建時間
Date date = new Date();
// 將時間轉(zhuǎn)為 LocalDateTime
LocalDateTime localDateTime = date.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
// 2020-02-03T14:07:49.833
System.out.println(localDateTime);
}
方式二
秒級精確;
@Test
public void DateTest2(){
// 創(chuàng)建時間
Date date = new Date();
// 將時間轉(zhuǎn)為 秒級時間戳
long second = date.toInstant().atOffset(ZoneOffset.ofHours(8)).toEpochSecond();
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(second, 0, ZoneOffset.ofHours(8));
// 2020-02-03T14:11:39
System.out.println(localDateTime);
}
4.2 LocalDateTime 轉(zhuǎn) Date
方式一
秒級
@Test
public void DateTest3(){
//當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 獲得 Instant
Instant instant = Instant.ofEpochSecond(localDateTime.toEpochSecond(ZoneOffset.ofHours(8)));
// 獲得 Date
Date date = Date.from(instant);
// Mon Feb 03 14:16:27 CST 2020
System.out.println(date);
}
方式二
@Test
public void DateTest4(){
//當(dāng)前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 獲得 Instant
Instant instant = localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant();
// 獲得 Date
Date date = Date.from(instant);
// Mon Feb 03 14:20:32 CST 2020
System.out.println(date);
}
五 LocalDate與Date互轉(zhuǎn)
5.1 LocalDate 轉(zhuǎn) Date
@Test
public void DateTest5(){
//當(dāng)前時間
LocalDate localDate = LocalDate.now();
// 獲得 Instant
Instant instant = localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant();
// 獲得 Date
Date date = Date.from(instant);
// Mon Feb 03 00:00:00 CST 2020
System.out.println(date);
}
5.2 Date 轉(zhuǎn)LocalDate
@Test
public void DateTest6(){
// 獲得 date
Date date = new Date();
// 獲得 LocalDate
LocalDate localDate = date.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDate();
// 2020-02-03
System.out.println(localDate);
}
六 LocalDateTime格式化
最后再說下格式化;知識追尋者這邊就不提 LocalDateTime, LocalDate , LocalTime 互轉(zhuǎn)問題阿逃,原因是前言那篇文章已經(jīng)提到過;
6.1 LocalDateTime 轉(zhuǎn)字符串
@Test
public void format1(){
// 獲得 localDateTime
LocalDateTime localDateTime = LocalDateTime.now();
// 指定模式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH/mm/ss");
// 將 LocalDateTime 格式化為字符串
String format = localDateTime.format(dateTimeFormatter);
// 2020/02/03 14/38/54
System.out.println(format);
}
6.2 字符串 轉(zhuǎn)LocalDateTime
@Test
public void format2(){
String time = "2020/02/03 14/38/54";
// 指定模式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH/mm/ss");
// 將字符串格式化為 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.parse(time, dateTimeFormatter);
// 2020-02-03T14:38:54
System.out.println(localDateTime);
}