需求
需求: 给你一个时间格式(yyyy-MM-dd) 你给我返回这个时间前一个月的时间戳,前一天的时间戳,前一周的时间戳
我:????
Java8的新API你用了,你会发现你再也回不去了?
不多说上代码
/**
* @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 日期时间(只有日期时间才有时间戳)
LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
// 转换成时间戳
return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
}
public static void main(String[] args) {
long lastMonthTimestamp = getTimestamp("2018-11-12");
System.out.println(lastMonthTimestamp);
}
}
可以看到很简单:
主要是三步:
- 格式化成日期
- 日期变成日期时间
- 日期时间通过
atZone()
确定时区,转换成Instant
,最后转换成时间戳
接下来骚操作来了。
获取上一个月时间戳:
private static long getLastMonthTimestamp(String dateText){
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 解析成java8 日期
LocalDate parse = LocalDate.parse(dateText, pattern);
// 解析成java8 日期时间(只有日期时间才有时间戳)
LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
// 获取上一个月时间戳
dateTime = dateTime.minusMonths(1);
// 转换成时间戳
return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
}
只需要加一行代码 dateTime.minusMonths(1);
同理,相同的获取前一天,前一周,具体调用不同的方法。
minusDays()
minusHours()
minusMinutes()
minusSeconds()
最骚的还有一个,就是可以指定特定的时间:
private static long specialDate(String dateText) {
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 解析成java8 日期
LocalDate parse = LocalDate.parse(dateText, pattern);
// 解析成java8 日期时间(只有日期时间才有时间戳)
LocalDateTime dateTime = LocalDateTime.of(parse, LocalTime.of(0, 0));
// 获取当前日期的12点0分0秒的时间戳
dateTime = dateTime.withHour(12)
.withMinute(0)
.withSecond(0);
// 转换成时间戳
return dateTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
}
获取特定小时分钟秒的时间戳。
withHour()
withMinute()
withSecond()
时间戳转换为特定格式日期
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;
}
时间戳转换为Instant
,然后从Instant
转换为LocalDateTime
,最后format即可。
总结
时间戳转日期:使用Instant.ofEpochSecond()
转换为 Instant
,然后调用LocalDateTime.ofInstant()
获取时间日期对象
注意:时间戳只能针对LocalDateTime,LocalDate是不具备时间戳的。
LocalDate
要想转成可以采用LocalDateTime
,可以调用LocalDateTime.of(localDate, LocalTime.of(0, 0));
字符串转日期:如果是yyyy-MM-dd
时间格式,那么采用LocalDate.parse()
,如果是yyyy-MM-dd HH:mm:ss
那么采用LocalDateTime.parse()
转换成了LocalDateTime
或者LocalDate
那么就可以调用具体的方法,去操作日期了。你就会发现你再也回不去了。