日期时间工具
介绍
日期时间包是Hutool的核心包之一,提供针对JDK中Date和Calendar对象的封装,封装对象。
日期时间工具
- DateUtil 针对日期时间操作提供一系列静态方法
- DateTime 提供类似于Joda-Time中日期时间对象的封装,继承自Date类,并提供更加丰富的对象方法。
- FastDateFormat 提供线程安全的针对Date对象的格式化和日期字符串解析支持。此对象在实际使用中并不需要感知,相关操作已经封装在DateUtil和DateTime的相关方法中。
- DateBetween 计算两个时间间隔的类,除了通过构造新对象使用外,相关操作也已封装在DateUtil和DateTime的相关方法中。
- TimeInterval 一个简单的计时器类,常用于计算某段代码的执行时间,提供包括毫秒、秒、分、时、天、周等各种单位的花费时长计算,对象的静态构造已封装在DateUtil中。
- DatePattern 提供常用的日期格式化模式,包括String类型和FastDateFormat两种类型。
日期时间工具-DateUtil
考虑到Java本身对日期时间的支持有限,并且Date和Calendar对象的并存导致各种方法使用混乱和复杂,故使用此工具类做了封装。这其中的封装主要是日期和字符串之间的转换,以及提供对日期的定位。
对于Date对象,为了便捷,使用了一个DateTime类来代替之,继承自Date对象,主要的便利在于,覆盖了toString()方法,返回yyyy-MM-dd HH:mm:ss形式的字符串,方便在输出时的调用(例如日志记录等),提供了众多便捷的方法对日期对象操作。
与java原有日期类型之间的转换
Date、long、Calendar之间的相互转换
//当前时间 Date date = DateUtil.date(); System.out.println(date); //当前时间 Date date2 = DateUtil.date(Calendar.getInstance()); System.out.println(date2); //当前时间 Date date3 = DateUtil.date(System.currentTimeMillis()); System.out.println(date3); //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss String now = DateUtil.now(); System.out.println(now); //当前日期字符串,格式:yyyy-MM-dd String today= DateUtil.today(); System.out.println(today);
字符串转日期和格式化输出
DateUtil.parse方法会自动识别一些常用格式,包括:
- yyyy-MM-dd HH:mm:ss
- yyyy/MM/dd HH:mm:ss
- yyyy.MM.dd HH:mm:ss
- yyyy年MM月dd日 HH时mm分ss秒
- yyyy-MM-dd
- yyyy/MM/dd
- yyyy.MM.dd
- HH:mm:ss
- HH时mm分ss秒
- yyyy-MM-dd HH:mm
- yyyy-MM-dd HH:mm:ss.SSS
- yyyyMMddHHmmss
- yyyyMMddHHmmssSSS
- yyyyMMdd
- EEE, dd MMM yyyy HH:mm:ss z
- EEE MMM dd HH:mm:ss zzz yyyy
- yyyy-MM-dd’T’HH:mm:ss’Z’
- yyyy-MM-dd’T’HH:mm:ss.SSS’Z’
- yyyy-MM-dd’T’HH:mm:ssZ
- yyyy-MM-dd’T’HH:mm:ss.SSSZ
- String dateStr = “2017-03-01”;
- Date date = DateUtil.parse(dateStr);
我们也可以使用自定义日期格式转化,
DateUtil.format可以设置0日期格式化,支持以上的格式,
String s1="2001-08-22 12:21:21"; DateTime s2 = DateUtil.parse(s1); // 输出2001-08-22 12:21:21 System.out.println(s2); String dateStr = "2017-03-01"; Date date = DateUtil.parse(dateStr); //设置自定义解析字符串格式化转换 String format = DateUtil.format(date, "yyyy/MM/dd"); //结果 2017/03/01 System.out.println(format); //设置自定义解析字符串格式化转换 String formatDateTime = DateUtil.formatDateTime(date); //结果:2017-03-01 00:00:00 System.out.println(formatDateTime); String formatTime = DateUtil.formatTime(date); //结果:00:00:00 System.out.println(formatTime);
其他功能
DateUtil还有其他几个不常用的功能,包括获取部分日期,日期枚举,日期偏移,计算时差,星座和属相
// 获取部分日期 // 获取当前日期 Date date=DateUtil.date(); //获得年的部分 System.out.println(DateUtil.year(date)); //获得月份,从0开始计数 System.out.println(DateUtil.month(date)); //获得月份枚举,用英文表示 System.out.println(DateUtil.monthEnum(date)); //日期偏移 //获取今天开始 System.out.println(DateUtil.beginOfDay(date)); //获取今天结束 System.out.println(DateUtil.endOfDay(date)); // 向后偏移七天 System.out.println(DateUtil.offset(date, DateField.DAY_OF_WEEK,7)); //由于上面的api还是过于繁琐,DateUtil还提供了一些更简化方法 //昨天 System.out.println(DateUtil.yesterday()); //明天 System.out.println(DateUtil.tomorrow()); //偏移三天 System.out.println(DateUtil.offsetDay(date,3)); // 计算时间差 String dateStr2 = "2017-04-01 23:33:23"; Date date2 = DateUtil.parse(dateStr2); // 计算时间差,并指定以天为单位 System.out.println(DateUtil.between(date,date2, DateUnit.DAY)); //格式化输出时间差 System.out.println(DateUtil.formatBetween(date,date2, BetweenFormatter.Level.DAY)); //星座和属相 // "摩羯座" String zodiac = DateUtil.getZodiac(Month.JANUARY.getValue(), 19); // "狗" String chineseZodiac = DateUtil.getChineseZodiac(1994); //计算年龄 DateUtil.ageOfNow("1990-01-30"); //判断是否为闰年 DateUtil.isLeapYear(2017);
DateTime
hutool中的DateTime类继承于java.util.Date类,为Date类扩展了众多简便方法,这些方法多是DateUtil静态方法的对象表现形式,使用DateTime对象可以完全替代开发中Date对象的使用。
新建对象
DateTime提供了多种参数构造
- Date
- Calendar
- String(日期字符串,第二个参数是日期格式)
- long 毫秒数
构建对象有两种方式:DateTime.of()和new DateTime():
Date date = new Date(); //new方式创建 DateTime time = new DateTime(date); Console.log(time); //of方式创建 DateTime now = DateTime.now(); DateTime dt = DateTime.of(date);
使用对象
DateTime的成员方法与DateUtil中的静态方法所对应,因为是成员方法,因此可以使用更少的参数操作日期时间。因为在上文已经进行较为完备的介绍,以根据上文的介绍自行使用。
TimeInterval
Hutool通过封装TimeInterval实现计时器功能,即可以计算方法或过程执行的时间。TimeInterval支持分组计时,方便对比时间。
TimeInterval timer = DateUtil.timer(); //--------------------------------- //-------这是执行过程 //--------------------------------- timer.interval();//花费毫秒数 timer.intervalRestart();//返回花费时间,并重置开始时间 timer.intervalMinute();//花费分钟数 // 也可以实现分组计时 final TimeInterval timer = new TimeInterval(); // 分组1 timer.start("1"); ThreadUtil.sleep(800); // 分组2 timer.start("2"); ThreadUtil.sleep(900); Console.log("Timer 1 took {} ms", timer.intervalMs("1")); Console.log("Timer 2 took {} ms", timer.intervalMs("2"));