java 判断时间先后顺序_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);

}

}

当前时间2020年10月04日 12点41分

当前日期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() +"毫秒");

}

}

1970年01月01日00时00分00秒起到现在经过1601787930秒

1970年01月01日00时00分00秒起到现在经过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分")));

}

}

2020年10月04日 13点05分

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:14public 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 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 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()));

}

}

- END -

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值