Java中关于日期的API貌似是有点尴尬的,从1.0中的Date到1.1中的Calendar,在到1.8中的LocalDateTime等,给我们增加了不少困惑,到底该使用哪一个?毫无疑问,我们要使用更强大的API,下面会列举出我所能想到的时间操作需求,可供参考。
另外有一些类还存在坑,所以在使用时间API时,需要额外的小心。
如果默认的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); } } 当前时间2020年10月04日 12点41分 当前日期2020-10-04isBefore如果返回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){ 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另外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())); } }