需求
需求: 給你一個(gè)時(shí)間格式(yyyy-MM-dd) 你給我返回這個(gè)時(shí)間前一個(gè)月的時(shí)間戳,前一天的時(shí)間戳,前一周的時(shí)間戳
我:????
Java8的新API你用了,你會(huì)發(fā)現(xiàn)你再也回不去了?
不多說上代碼
/**
* @author :hujiansong
* @date :2019/6/24 17:59
* @since :1.8
*/
public class NewDateTimeAPI {
private static long getTimestamp(String dateText){
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 解析成java8 日期
LocalDate parse = LocalDate.parse(dateText, pattern);
// 解析成java8 日期時(shí)間(只有日期時(shí)間才有時(shí)間戳)
LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
// 轉(zhuǎn)換成時(shí)間戳
return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
}
public static void main(String[] args) {
long lastMonthTimestamp = getTimestamp("2018-11-12");
System.out.println(lastMonthTimestamp);
}
}
可以看到很簡(jiǎn)單:
主要是三步:
- 格式化成日期
- 日期變成日期時(shí)間
- 日期時(shí)間通過
atZone()確定時(shí)區(qū),轉(zhuǎn)換成Instant,最后轉(zhuǎn)換成時(shí)間戳
接下來騷操作來了。
獲取上一個(gè)月時(shí)間戳:
private static long getLastMonthTimestamp(String dateText){
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 解析成java8 日期
LocalDate parse = LocalDate.parse(dateText, pattern);
// 解析成java8 日期時(shí)間(只有日期時(shí)間才有時(shí)間戳)
LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
// 獲取上一個(gè)月時(shí)間戳
dateTime = dateTime.minusMonths(1);
// 轉(zhuǎn)換成時(shí)間戳
return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
}
只需要加一行代碼 dateTime.minusMonths(1);
同理,相同的獲取前一天,前一周,具體調(diào)用不同的方法。
minusDays()
minusHours()
minusMinutes()
minusSeconds()
最騷的還有一個(gè),就是可以指定特定的時(shí)間:
private static long specialDate(String dateText) {
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 解析成java8 日期
LocalDate parse = LocalDate.parse(dateText, pattern);
// 解析成java8 日期時(shí)間(只有日期時(shí)間才有時(shí)間戳)
LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
// 獲取當(dāng)前日期的12點(diǎn)0分0秒的時(shí)間戳
dateTime = dateTime.withHour(12)
.withMinute(0)
.withSecond(0);
// 轉(zhuǎn)換成時(shí)間戳
return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
}
獲取特定小時(shí)分鐘秒的時(shí)間戳。
withHour()
withMinute()
withSecond()
時(shí)間戳轉(zhuǎn)換為特定格式日期
public static String ts2Str(long second){
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(second), ZoneId.systemDefault());
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = localDateTime.format(pattern);
return format;
}
時(shí)間戳轉(zhuǎn)換為Instant,然后從Instant轉(zhuǎn)換為LocalDateTime,最后format即可。
總結(jié)
時(shí)間戳轉(zhuǎn)日期:使用Instant.ofEpochSecond()轉(zhuǎn)換為 Instant,然后調(diào)用LocalDateTime.ofInstant()獲取時(shí)間日期對(duì)象
注意:時(shí)間戳只能針對(duì)LocalDateTime,LocalDate是不具備時(shí)間戳的。
LocalDate要想轉(zhuǎn)成可以采用LocalDateTime,可以調(diào)用LocalDateTime.of(localDate, LocalTime.of(0, 0));
字符串轉(zhuǎn)日期:如果是yyyy-MM-dd時(shí)間格式,那么采用LocalDate.parse(),如果是yyyy-MM-dd HH:mm:ss那么采用LocalDateTime.parse()
轉(zhuǎn)換成了LocalDateTime或者LocalDate那么就可以調(diào)用具體的方法,去操作日期了。你就會(huì)發(fā)現(xiàn)你再也回不去了。