Java8时间操作参考大全,一文打尽

前言

Java中关于日期的API貌似是有点尴尬的,从1.0中的Date到1.1中的Calendar,在到1.8中的LocalDateTime等,给我们增加了不少困惑,到底该使用哪一个?毫无疑问,我们要使用更强大的API,下面会列举出我所能想到的时间操作需求,可供参考。

另外有一些类还存在坑,所以在使用时间API时,需要额外的小心。

获取当前日期、时间

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime =LocalDateTime.now();
        LocalDate localDate =LocalDate.now();
        System.out.println("当前时间"+localDateTime);
        System.out.println("当前日期"+localDate);
    }
}
当前时间2020-10-04T12:38:52.790
当前日期2020-10-04

自定义格式时间

如果默认的toString不符合我们的需要,可以自定义格式,就需要用到DateTimeFormatter类。

注意HH是24小时格式,hh是12小时格式。

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime =LocalDateTime.now();
        LocalDate localDate =LocalDate.now();
        DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分");
        System.out.println("当前时间"+localDateTime.format(formatter));
        System.out.println("当前日期"+localDate);
    }
}

当前时间202010041241分
当前日期2020-10-04

字符串转时间

public class Main {
    public static void main(String[] args){
        String timer ="2020年09月04日 12点41分";
        DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分");
        LocalDateTime localDateTime =LocalDateTime.parse(timer,formatter);
        System.out.println(localDateTime);
    }
}
2020-09-04T12:41

构建指定时间

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime =LocalDateTime.of(2020,10,8,18,40);
        System.out.println(localDateTime);
    }
}
2020-10-08T18:40

时间、时间戳互转

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime =LocalDateTime.now();
        System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toEpochSecond(ZoneOffset.of("+8")) +"秒");
        
        System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() +"毫秒");
    }
}

19700101000000秒起到现在经过160178793019700101000000秒起到现在经过1601787930748毫秒
public class Main {
    public static void main(String[] args){
//        LocalDateTime localDateTime =LocalDateTime.now();
//        System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toEpochSecond(ZoneOffset.of("+8")) +"秒");
//
//        System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() +"毫秒"
        Instant instant =Instant.ofEpochMilli(1601787930748l);
        LocalDateTime localDateTime =LocalDateTime.ofInstant(instant,ZoneOffset.of("+8"));
        System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分")));
    }
}
202010041305

Date、LocalDateTime互转

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime =LocalDateTime.now();
        Date date = new Date(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(date));
    }
}

2020-10-04 13:14
public class Main {
    public static void main(String[] args){
        Date date = new Date();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.of("+8"));
        System.out.println(localDateTime);
        
    }
}
2020-10-04T13:17:32.459

Calendar、LocalDateTime互转

public class Main {
    public static void main(String[] args){
        /**
         * 当前时间+3天后的LocalDateTime
         */
        LocalDateTime localDateTime = LocalDateTime.now().plusDays(3);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
    }
}
public class Main {
    public static void main(String[] args){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,5);
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneId.of("+8"));
        System.out.println(localDateTime);
    }
}
2020-10-09T14:31:32.452

比较时间前后

isBefore如果返回true,则表示自身在目标时间前面,同样还有个isAfter方法,判断自身是不是在目标时间后面。

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime1 = LocalDateTime.now();
        LocalDateTime localDateTime12 = localDateTime1.plusHours(1);
        System.out.println("时间1在时间2前面"+localDateTime1.isBefore(localDateTime12));
    }
}

还可以通过时间戳、compareTo比较,compareTo如果较小,则返回负值,如果大于,则返回正值,相等返回0。

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime1 = LocalDateTime.now();
        LocalDateTime localDateTime12 = localDateTime1.plusHours
        int i = localDateTime12.compareTo(localDateTime1);
        System.out.println(i);
    }
}
1

通过时间戳相减,就能判断哪个时间大。

public class Main {
    public static void main(String[] args){
        LocalDateTime localDateTime1 = LocalDateTime.now();
        LocalDateTime localDateTime12 = localDateTime1.plusHours(1);
        System.out.println(localDateTime1.toInstant(ZoneOffset.of("+8")).toEpochMilli()-
                localDateTime12.toInstant(ZoneOffset.of("+8")).toEpochMilli()<0?"小于":"大小");
    }
}
小于

时间增加、减少

主要通过plusXXXX和minusXXXX增加、减少。

public class Main {
    public static void main(String[] args){
        {
            LocalDateTime localDateTime1 = LocalDateTime.now();
            /**
             * 当前时间增加2小时
             */
            LocalDateTime newLocalDateTime = localDateTime1.plusHours(2);
            System.out.println(newLocalDateTime);
        }
        {
            LocalDateTime localDateTime1 = LocalDateTime.now();
            /**
             * 当前时间减少2小时
             */
//            LocalDateTime newLocalDateTime = localDateTime1.minusHours(2);
            LocalDateTime newLocalDateTime = localDateTime1.plusHours(-2);
            System.out.println(newLocalDateTime);
        }
        {
            LocalDateTime localDateTime1 = LocalDateTime.now();
            /**
             * 当前时间加上2个月
             */
            LocalDateTime newLocalDateTime = localDateTime1.plusMonths(2);
            System.out.println(newLocalDateTime);
        }
    }
}

获取指定字段值

public class Main {
    public static void main(String[] args){
        LocalDateTime now = LocalDateTime.now();
        /**
         * 年
         */
        System.out.println(now.get(ChronoField.YEAR));
        /**
         * 月
         */
        System.out.println(now.get(ChronoField.MONTH_OF_YEAR));
        /**
         * 日
         */
        System.out.println(now.get(ChronoField.DAY_OF_MONTH));
        /**
         * 小时
         */
        System.out.println(now.get(ChronoField.HOUR_OF_DAY));
        /**
         * 分钟
         */
        System.out.println(now.get(ChronoField.MINUTE_OF_HOUR));
    }
}
2020
10
4
13
51

LocalDateTime排序

升序

public class Main {

    public static void main(String[] args){
        List<LocalDateTime> collect = Stream.generate(() -> {
            Instant instant = Instant.ofEpochSecond(new Random().nextInt(2001787930 - 1600000000) + 1600000000);
            return LocalDateTime.ofInstant(instant, ZoneId.of("+8"));
        }).limit(10).collect(Collectors.toList());

        Collections.sort(collect, (o1, o2) -> o1.isAfter(o2)?1:-1);
        
        collect.forEach(localDateTime -> System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))));

    }
}
2021-09-20 21:24
2023-12-31 04:48
2024-12-24 07:35
2025-06-29 02:45
2028-01-04 09:14
2028-04-08 12:44
2029-11-01 23:51
2031-09-24 20:49
2031-12-30 08:41
2033-01-24 12:34

降序

public class Main {
    public static void main(String[] args){
        List<LocalDateTime> collect = Stream.generate(() -> {
            Instant instant = Instant.ofEpochSecond(new Random().nextInt(2001787930 - 1600000000) + 1600000000);
            return LocalDateTime.ofInstant(instant, ZoneId.of("+8"));
        }).limit(10).collect(Collectors.toList());
        
        Collections.sort(collect, (o1, o2) -> o1.isBefore(o2)?1:-1);
        
        collect.forEach(localDateTime -> System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))));
    }
}
2032-03-07 20:59
2031-12-28 02:02
2030-12-17 12:37
2030-02-14 21:14
2029-11-22 23:28
2029-05-06 12:32
2027-12-28 00:58
2027-01-24 14:25
2025-08-15 14:17
2025-04-04 22:07

时间间隔

public class Main {
    public static void main(String[] args){
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime localDateTime = now.plusHours(1);
        Duration between = Duration.between(localDateTime, now);
        /**
         * 相差的秒数
         */
        System.out.println(Math.abs(between.getSeconds()));
        /**
         * 相差小时
         */
        System.out.println(Math.abs(between.getSeconds()/3600));
    }
}

日期间隔

public class Main {
    public static void main(String[] args){
        LocalDate now =LocalDate.now();
        LocalDate localDate1 = now.plusDays(3);
        Period between = Period.between(now, localDate1);
        /**
         * 相差天数
         */
        System.out.println(between.getDays());
        /**
         * 相差月数
         */
        System.out.println(between.get(ChronoUnit.MONTHS));
    }
}
3
0

格式化Date

另外SimpleDateFormat是线程不安全,可以通过ThreadLocal解决。

public class Main {
    public static void main(String[] args){
        SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm");
        System.out.println(simpleDateFormat.format(new Date()));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值