近况
我觉得熟悉使用一些常用库对于一个程序员来说挺重要的,或许你可以写一个字符串工具类,时间处理工具类
但是可能比不上别人已经写好的轮子,重复造轮子真的没有意义,学习使用别人的工具,站在别人肩膀上
可以做出更好的东西,这就是为什么我要学习一些基础类库,学习别人的工具,我觉得如果能把hutools库
掌握好,我能提升非常多,我可以做更多其他东西,而不是故步自封学习增删改查。
话不多说,进入正题,对时间的处理是在开发中必不可少的能力,最近学习了一下这方面的内容,记录一下吧
LocalDate,LocalTime,LocalDateTime
这3个是Java8中对日期时间操作的类,LocalDate操作日期,例如年月日,LocalTime则是操作时间,例如时分秒
而LocalDateTime则是操作两者,下面来看看这三个类的基本使用吧
//1.1,LocalDate,创建
LocalDate now = LocalDate.now();
LocalDate date = LocalDate.of(2022, 7, 21);
System.out.println(now.toString()) //输出2022-07-21字符串
//1.2,LocalDate,字符串和日期互转
//字符串转日期
LocalDate localDate = LocalDate.parse("7-22-2020", DateTimeFormatter.ofPattern("M-d-yyyy"));
//日期转字符串
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("d-M-yyyy"));
System.out.println(date); //输出21-7-2022字符串
//2.1,LocalTime,创建
LocalTime time = LocalTime.now();
LocalTime time = LocalTime.of(15, 39, 0);
LocalTime time = LocalTime.parse("15:42:59");
//2.2,LocalTime,字符串和时间互转
//字符串转时间
LocalTime time = LocalTime.parse("15:48:50", DateTimeFormatter.ofPattern("HH:mm:ss"));
//时间转字符串
//输出47:59:3字符串
System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("ss:mm:h")).toString());
//LocalDateTime省略,基本上和上面两个类似
上面是一点简单使用,我们可以学到下面两点
- DateTimeFormatter在parse方法中用于解析使用者提供的字符串,使得这些日期时间类能识别出来
DateTimeFormatter在format方法中用于将日期时间按照指定的格式输出成字符串 - LocalDate默认输出格式:
yyyy-MM-dd
LocalTime默认输出格式:HH:mm:ss
LocalDateTime默认输出格式:yyyy-MM-ddTHH:mm:ss
HH与hh的区别是:HH表示24小时格式,hh表示12小时格式
单个字符和双个字符(H和HH)的区别是:单个字符输出5时为5,双个字符输出5时为05
Hutools的日期时间工具类
DateUtil
针对日期时间操作提供一系列静态方法DateTime
提供类似于Joda-Time中日期时间对象的封装,继承自Date类,并提供更加丰富的对象方法。FastDateFormat
提供线程安全的针对Date对象的格式化和日期字符串解析支持。此对象在实际使用中并不需要感知,相关操作已经封装在DateUtil
和DateTime
的相关方法中。DateBetween
计算两个时间间隔的类,除了通过构造新对象使用外,相关操作也已封装在DateUtil
和DateTime
的相关方法中。TimeInterval
一个简单的计时器类,常用于计算某段代码的执行时间,提供包括毫秒、秒、分、时、天、周等各种单位的花费时长计算,对象的静态构造已封装在DateUtil
中。DatePattern
提供常用的日期格式化模式,包括String
类型和FastDateFormat
两种类型。
关于日期时间的工具类太复杂了,现在就学习一下DateUtil工具类的简单使用吧
//字符串与日期时间互转
DateTime dateTime = DateUtil.parse("2020-2-1", "yyyy-MM-dd");
String dateTimeStr = DateUtil.format(dateTime, "M-d-yyyy");
System.out.println(dateTimeStr); //输出2-1-2020
//时间的偏移
DateTime dateTime = DateUtil.parse("2020-2-1", "yyyy-MM-dd");
System.out.println(DateUtil.offsetDay(dateTime, -1).toString());//2020-01-31 00:00:00
System.out.println(DateUtil.offsetDay(dateTime, 3).toString());//2020-02-04 00:00:00
Date newDate = DateUtil.offset(new Date(), DateField.DAY_OF_MONTH, 2); //2天后
DateUtil.yesterday() //昨天
DateUtil.tomorrow() //明天
DateUtil.lastMonth() //上个月
DateUtil.nextMonth() //下个月
//比较两个时间大小
DateTime began = DateUtil.parse("2020-2-1", "yyyy-MM-dd");
DateTime end = DateUtil.offsetDay(new Date(), -1);
System.out.println(began.isBefore(end)); //true
//获取一天,一个月,一年的开始时间和结束时间
System.out.println(DateUtil.beginOfDay(new Date()).toString());
System.out.println(DateUtil.endOfDay(new Date()).toString());
System.out.println(DateUtil.beginOfMonth(new Date()).toString());
System.out.println(DateUtil.endOfMonth(new Date()).toString());
System.out.println(DateUtil.beginOfYear(new Date()).toString());
System.out.println(DateUtil.endOfYear(new Date()).toString());
输出
2022-07-21 00:00:00
2022-07-21 23:59:59
2022-07-01 00:00:00
2022-07-31 23:59:59
2022-01-01 00:00:00
2022-12-31 23:59:59
//日期时间差
String dateStr1 = "2017-03-01 22:33:23";
Date date1 = DateUtil.parse(dateStr1);
String dateStr2 = "2017-04-01 23:33:23";
Date date2 = DateUtil.parse(dateStr2);
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY); //相差一个月,31天
//获取Date对象的某个部分
DateTime startDate = DateUtil.beginOfYear(new Date());
startDate.getField(DateField.YEAR);
startDate.getField(DateField.MONTH);
startDate.getField(DateField.HOUR);
startDate.getField(DateField.MINUTE);
//是否闰年
DateUtil.isLeapYear(2017);
以上就是基本的使用啦,最近优化了一下之前写的代码,其中涉及到了关于时间的使用,
需求是输出2020年2月1日到昨天之内的时间字符串,每10天统计一次,并拼成M-d-yyyy的格式
ArrayList<String> allDateStr = new ArrayList<>();
DateTime began = DateUtil.parse("2020-2-1", "yyyy-MM-dd");
DateTime end = DateUtil.offsetDay(new Date(), -1);
for (;began.isBefore(end);began=DateUtil.offsetDay(began,10)){
String dateStr = DateUtil.format(began, "M-d-yyyy");
allDateStr.add(dateStr);
}