Java8日期Api,看完你再也回不去了!

需求

需求: 给你一个时间格式(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);
    }
}

可以看到很简单:

主要是三步:

  1. 格式化成日期
  2. 日期变成日期时间
  3. 日期时间通过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那么就可以调用具体的方法,去操作日期了。你就会发现你再也回不去了。

你可能感兴趣的:(Java8日期Api,看完你再也回不去了!)