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

    科技2022-07-13  147

    前言

    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())); } }
    Processed: 0.009, SQL: 8