1. 概述
本篇文章主要介绍Java开发常用的工具类,所谓工欲善其事必先利其器,有了好的工具无论是工作还是学习都会游刃有余。
本文主要介绍日期/时间处理工具类:FastDateFormat、DateFormatUtils、DateUtils。
Maven仓库地址:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
2. FastDateFormat
FastDateFormat是一个快速且线程安全的时间操作类,它完全可以替代SimpleDateFromat。因为是线程安全的,所以你可以把它作为一个类的静态字段使用。构造方法为protected,不允许直接构造它的对象,可以通过工厂方法获取。FastDateFormat之所以是线程安全的,是因为这个类是无状态的:内部的成员在构造时就完成了初始化,并在对象存活期,不提供任何API供外界修改他们。
2.1 获取实例
// 使用默认区域设置中的默认格式获取实例
public static FastDateFormat getInstance();
// 使用默认区域设置中的指定格式获取实例
public static FastDateFormat getInstance(String pattern);
// 使用指定的时区和格式获取实例
public static FastDateFormat getInstance(String pattern, TimeZone timeZone);
// 使用指定的格式和区域设置来获取实例
public static FastDateFormat getInstance(String pattern, Locale locale);
// 使用指定的格式、时区、区域设置来获取实例
public static FastDateFormat getInstance(String pattern, TimeZone timeZone, Locale locale);
// 在默认时区和默认区域设置中使用指定样式获取日期实例
public static FastDateFormat getDateInstance(int style);
// 在默认时区和指定区域设置中使用指定样式获取日期实例
public static FastDateFormat getDateInstance(int style, Locale locale);
// 在指定时区和默认区域设置中使用指定样式获取日期实例
public static FastDateFormat getDateInstance(int style, TimeZone timeZone);
// 在指定时区和指定区域设置中使用指定样式获取日期实例
public static FastDateFormat getDateInstance(int style, TimeZone timeZone, Locale locale);
// 在默认时区和默认区域设置中使用指定样式获取时间实例
public static FastDateFormat getTimeInstance(int style);
// 在默认时区和指定区域设置中使用指定样式获取时间实例
public static FastDateFormat getTimeInstance(int style, Locale locale);
// 在指定时区和默认区域设置中使用指定样式获取时间实例
public static FastDateFormat getTimeInstance(int style, TimeZone timeZone);
// 在指定时区和指定区域设置中使用指定样式获取时间实例
public static FastDateFormat getTimeInstance(int style, TimeZone timeZone, Locale locale);
// 在默认时区和默认区域设置中使用指定样式获取日期和时间实例
public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle);
// 在默认时区和指定区域设置中使用指定样式获取日期和时间实例
public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale);
// 在指定时区和默认区域设置中使用指定样式获取日期和时间实例
public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, TimeZone timeZone);
// 在指定时区和指定区域设置中使用指定样式获取日期和时间实例
public static FastDateFormat getDateTimeInstance(int dateStyle, int timeStyle, TimeZone timeZone, Locale locale);
2.2 格式化
// 设置日期、日历对象的格式
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos);
// 格式化毫秒值
public String format(long millis);
// 格式化日期
public String format(Date date);
// 格式化日历
public String format(Calendar calendar);
2.3 获取格式化日期使用的格式
public String getPattern();
2.4 获取格式化日期使用的时区
public TimeZone getTimeZone();
2.5 获取格式化日期使用的区域
public Locale getLocale();
3. DateFormatUtils
将时间转化为字符串的工具类。不可实例化对象且线程安全,依赖于FastDateFormat。
3.1 常量
// yyyy-MM-dd'T'HH:mm:ss
public static final FastDateFormat ISO_8601_EXTENDED_DATETIME_FORMAT;
// yyyy-MM-dd'T'HH:mm:ssZZ
public static final FastDateFormat ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT;
// yyyy-MM-dd
public static final FastDateFormat ISO_8601_EXTENDED_DATE_FORMAT;
// HH:mm:ss
public static final FastDateFormat ISO_8601_EXTENDED_TIME_FORMAT;
// HH:mm:ssZZ
public static final FastDateFormat ISO_8601_EXTENDED_TIME_TIME_ZONE_FORMAT;
// EEE, dd MMM yyyy HH:mm:ss Z
public static final FastDateFormat SMTP_DATETIME_FORMAT;
3.2 格式化
// 使用UTC时区将日期/时间格式化为特定模式
public static String formatUTC(long millis, String pattern);
public static String formatUTC(Date date, String pattern);
// 使用UTC时区和指定区域将日期/时间格式化为特定模式
public static String formatUTC(long millis, String pattern, Locale locale);
public static String formatUTC(Date date, String pattern, Locale locale);
// 格式化日期/时间
public static String format(long millis, String pattern);
public static String format(Date date, String pattern);
public static String format(Calendar calendar, String pattern);
// 按指定时区格式化日期/时间
public static String format(long millis, String pattern, TimeZone timeZone);
public static String format(Date date, String pattern, TimeZone timeZone);
public static String format(Calendar calendar, String pattern, TimeZone timeZone);
// 按指定区域格式化日期/时间
public static String format(long millis, String pattern, Locale locale);
public static String format(Date date, String pattern, Locale locale);
public static String format(Calendar calendar, String pattern, Locale locale);
// 按指定时区、区域格式化日期/时间
public static String format(long millis, String pattern, TimeZone timeZone, Locale locale);
public static String format(Date date, String pattern, TimeZone timeZone, Locale locale);
public static String format(Calendar calendar, String pattern, TimeZone timeZone, Locale locale);
4. DateUtils
4.1 常量
// 标准秒的毫秒数 1000L
public static final long MILLIS_PER_SECOND;
// 标准分钟的毫秒数 60000L
public static final long MILLIS_PER_MINUTE;
// 标准小时的毫秒数 3600000L
public static final long MILLIS_PER_HOUR;
// 标准天的毫秒数 86400000L
public static final long MILLIS_PER_DAY;
4.2 日期/时间比对
// 检查两个日期是否在同一天,忽略时间
public static boolean isSameDay(Date date1, Date date2);
public static boolean isSameDay(Calendar cal1, Calendar cal2);
// 检查两个日期在时间上是否表示同一时刻,具体到毫秒值
public static boolean isSameInstant(Date date1, Date date2);
public static boolean isSameInstant(Calendar cal1, Calendar cal2);
// 检查两个日历对象是否表示相同的本地时间
public static boolean isSameLocalTime(Calendar cal1, Calendar cal2);
4.3 解析日期/时间字符串
// 尝试用不同的格式来解析字符串,如果都不匹配,抛出ParseException
public static Date parseDate(String str, String... parsePatterns);
// 按指定的区域、尝试用不同的格式来解析字符串,如果都不匹配,抛出ParseException
public static Date parseDate(String str, Locale locale, String... parsePatterns);
// 尝试用不同的格式来解析字符串,如果都不匹配,抛出ParseException,解析时会校验字符串的格式是否正确
public static Date parseDateStrictly(String str, String... parsePatterns);
// 按指定的区域、尝试用不同的格式来解析字符串,如果都不匹配,抛出ParseException,解析时会校验字符串的格式是否正确
public static Date parseDateStrictly(String str, Locale locale, String... parsePatterns);
4.4 日期/时间操作
// 返回增加/减少的年份的日期,原日期不变
public static Date addYears(Date date, int amount);
// 返回增加/减少的月份的日期,原日期不变
public static Date addMonths(Date date, int amount);
// 返回增加/减少的星期的日期,原日期不变
public static Date addWeeks(Date date, int amount);
// 返回增加/减少的天数的日期,原日期不变
public static Date addDays(Date date, int amount);
// 返回增加/减少的小时的日期,原日期不变
public static Date addHours(Date date, int amount);
// 返回增加/减少的分钟的日期,原日期不变
public static Date addMinutes(Date date, int amount);
// 返回增加/减少的秒的日期,原日期不变
public static Date addSeconds(Date date, int amount);
// 返回增加/减少的毫秒的日期,原日期不变
public static Date addMilliseconds(Date date, int amount);
// 设置年份,返回新的对象,原对象日期不变
public static Date setYears(Date date, int amount);
// 设置月份,返回新的对象,原对象日期不变
public static Date setMonths(Date date, int amount);
// 设置日期,返回新的对象,原对象日期不变
public static Date setDays(Date date, int amount);
// 设置小时,返回新的对象,原对象日期不变
public static Date setHours(Date date, int amount);
// 设置分钟,返回新的对象,原对象日期不变
public static Date setMinutes(Date date, int amount);
// 设置秒,返回新的对象,原对象日期不变
public static Date setSeconds(Date date, int amount);
// 设置毫秒,返回新的对象,原对象日期不变
public static Date setMilliseconds(Date date, int amount);
4.5 日期转日历
// 将日期转为日历
public static Calendar toCalendar(Date date);
// 将日期按时区转为日历
public static Calendar toCalendar(Date date, TimeZone tz);
4.6 初始化
// 将指定类型后面的日期初始化
// 可选类型:Calendar.SECOND Calendar.MINUTE Calendar.HOUR_OF_DAY Calendar.DAY_OF_MONTH Calendar.MONTH Calendar.YEAR
public static Date round(Date date, int field);
public static Calendar round(Calendar date, int field);
public static Date round(Object date, int field);
// 例:
DateUtils.round(new Date(), Calendar.YEAR); // 2019-01-01 00:00:00
DateUtils.round(new Date(), Calendar.HOUR_OF_DAY); // 2019-08-15 01:00:00
// 从给定字段开始格式化截取日期,对一个时间对象的某个字段进行截取
public static Date truncate(Date date, int field);
public static Calendar truncate(Calendar date, int field);
public static Date truncate(Object date, int field);
// 从给定字段开始“向上”格式化日期
public static Date ceiling(Date date, int field);
public static Calendar ceiling(Calendar date, int field);
public static Date ceiling(Object date, int field);