在java8之前,操作日期和时间jdk提供了Date类和Calendar类,想想其操作就很头疼,及其不方便,所以项目里更多操作时间和日期的地方都要引入第三方jar包,joda-time就是很受欢迎的一个。 闲话少说,直接上代码。 如果想获取下一秒怎么办? 之前:
Date now = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.SECOND, 1);
Date nextSecond = calendar.getTime();
之后:
LocalTime time = LocalTime.now();
LocalTime nextSecond = time.plusSeconds(1);
amazing?有没有? 不仅代码简洁了很多,而且也很容易理解,当前time就是用LocalTime.now();下一秒就是plusSeconds(1)即可;
再比如想获取今天12:30:56(即中午十二点三十分56秒)呢? 之前:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 12);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 56);
//calendar.set(2017,06,27,12,30,56);
可以小时,分钟,秒分别置给calendar对象,也可以使用下面注释的那行,不过必须还要传入日期(注意第二个参数month是从0开始的,7月就要传入6。。。),很麻烦 之后:
LocalTime time = LocalTime.of(12,30,56,0);
简单的发指。。(注意最后一个参数是nanoOfSecond,还有一个不传入此参数的方法)
当然 LocalTime类还提供了一些其他的静态属性和方法,比如 LocalTime提供的静态属性和静态方法 Collapse source
LocalTime MIDNIGHT; //午夜时分
LocalTime MIN; //00:00一天的开始 同上方的午夜
LocalTime MAX; //23:59:59.999999999 午夜前的最后一刻
LocalTime NOON; //中午 12:00
long secondsOfDay = 3600;
LocalTime oneClock = LocalTime.ofSecondOfDay(secondsOfDay); //返回当日某个秒数对应的对象,比如 3600 对应01:00
System.out.println("hour:"+oneClock.getHour()+"\tminutes:"+oneClock.getMinute());//getHour,getMinute,getSecond->返回对象对应的时分秒
LocalTime twoClock = oneClock.withHour(2); //返回onclick对象是否小时维度是2,如果是,就返回,否则返回 小时是2,分表是onclock的分秒
System.out.println("02:00对应一天的第 " + twoClock.toSecondOfDay() + "秒"); //返回twoClock对应的秒数(7200)
System.out.println("2点和1点比较:\t" + twoClock.compareTo(oneClock)); //重写了compareTo方法,返回2个localtime大小比较,大于1,小于-1,等于0
System.out.println("1点是在2点之后吗?\t" + oneClock.isAfter(twoClock)); //返回2者前后比较(isBefore) 实际还是调用的compareTo方法
System.out.println("重写了equals方法:\t" + twoClock.equals(LocalTime.of(2,0))); //重写了equals方法
System.out.println("重写了toString方法:\t" + LocalTime.of(12,30,56).toString()); //重写了toString方法
打印结果如下: hour:1 minutes:0 02:00对应一天的第 7200秒 2点和1点比较: 1 1点是在2点之后吗? false 重写了equals方法: true 重写了toString方法: 12:30:56
还有一些没有深入研究的方法,比如parse,format等,有兴趣可以看看
当然,细心的童鞋发现了,怎么都是操作时间的,说好的日期呢? 并不是我不想一起写,而是因为jdk将time和date分开了,同上面的LocalTime,日期的操作在LocalDate类里,属性、方法和LocalTime大同小异,当然多了一些特殊的方法, 比如 LocalTime有 toSecondOfDay 返回对象在一天中对应的秒数, LocalDate中包含了getDayOfMonth(返回1-31),getDayOfYear(1-366),getDayOfWeek(1-7 monday是1) 还有一些其他的, 比如isLeapYear(是否是闰年) lenthOfMonth(当前对象,月的天数) 同理lenthOfYear(当前年的天数 365或366) 这些api真是方便的很,基本开发就够用了
是不是一会Date 一会Time的都绕糊涂了?没有?什么?你说为什么不能2个结合起来,我只能说,小明同学,你很有前途: 当当当当~jdk8 还有一个LocalDateTime类。。。行了,也不说了,用到了自己去查看api吧。。
其他说明:
新Date类和Time类背后的设计原则: 不可变类 java8之前,Date类都是可变类。当我们在多线程环境下使用它,编程人员应该确认Date对象的线程安全。Java8的Date和Time API提供了线程安全的不可变类。编程人员不用考虑并发的问题。 领域模型驱动设计方法 新的日期和时间的类别遵循“域驱动设计”。对于开发者来说,理解方法和类的功能是很容易的。 Java8中的date和time api是jodatime的作者参与开发的,实现了JSR310的全部内容。这些新的api都在包java.time下。
传一个time包下对应的类的图
参考链接:java8 LocalDate LocalDateTime等时间类介绍