【日期工具类】DateUtils

[ 常量 ]

public static final long MILLIS_PER_SECOND = 1000;

public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND;

public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE;

public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR;

public static final int SEMI_MONTH = 1001;

private static final int[][] fields = {
        {Calendar.MILLISECOND},
        {Calendar.SECOND},
        {Calendar.MINUTE},
        {Calendar.HOUR_OF_DAY, Calendar.HOUR},
        {Calendar.DATE, Calendar.DAY_OF_MONTH, Calendar.AM_PM
            /* Calendar.DAY_OF_YEAR, Calendar.DAY_OF_WEEK, Calendar.DAY_OF_WEEK_IN_MONTH */
        },
        {Calendar.MONTH, SEMI_MONTH},
        {Calendar.YEAR},
        {Calendar.ERA}};

public static final int RANGE_WEEK_SUNDAY = 1;

public static final int RANGE_WEEK_MONDAY = 2;

public static final int RANGE_WEEK_RELATIVE = 3;

public static final int RANGE_WEEK_CENTER = 4;

public static final int RANGE_MONTH_SUNDAY = 5;

public static final int RANGE_MONTH_MONDAY = 6;


private enum ModifyType {
    TRUNCATE,

    ROUND,

    CEILING
}

 

[ 常用方法 ]

参数

// 当前时间
Date date = new Date();
// 时间输出
Consumer<Date> consumer = object -> {
    String format = DateFormatUtils.format(object, "yyyy-MM-dd HH:mm:ss");
    System.out.println(format);
};

 

当前日期指定字段添加多少时间,可以为负数

// 当前日期加1年
DateUtils.addYears(date, 1);
// 当前日期加1个月
DateUtils.addMonths(date, 1);
// 当前日期加1天
DateUtils.addDays(date, 1);
// 当前日期加1个星期
DateUtils.addWeeks(date, 1);
// 当前日期加1小时
DateUtils.addHours(date, 1);
// 当前日期加1分钟
DateUtils.addMinutes(date, 1);
// 当前日期加1秒钟
DateUtils.addSeconds(date, 1);
// 当前日期加1毫秒
DateUtils.addMilliseconds(date, 1);


DateUtils.ceiling(final Date date, final int field)  => 截取日期时间的部分值,截取的末尾部分向上取整

Date ceilYear   = DateUtils.ceiling(date, Calendar.YEAR);
Date ceilMonth  = DateUtils.ceiling(date, Calendar.MONTH);
Date ceilDay    = DateUtils.ceiling(date, Calendar.DAY_OF_MONTH);
Date ceilHour   = DateUtils.ceiling(date, Calendar.HOUR);
Date ceilMinute = DateUtils.ceiling(date, Calendar.MINUTE);
Date ceilSecode = DateUtils.ceiling(date, Calendar.SECOND);

consumer.accept(date);//2018-11-23 11:32:12
consumer.accept(ceilYear);//2019-01-01 00:00:00,截取到年,年向上取整(即+1)
consumer.accept(ceilMonth);//2018-12-01 00:00:00,截取到月,月向上取整(即+1);如果是12月的话,月进1变成01,年进1
consumer.accept(ceilDay);//2018-11-24 00:00:00,截取到日,日向上取整(即+1);如果是30(或28/31)的话,日进1变成01,月进1
consumer.accept(ceilHour);//2018-11-23 12:00:00,截取到时,时向上取整(即+1);如果是23点的话,时进1变成00,日进1
consumer.accept(ceilMinute);//2018-11-23 11:33:00,截取到分,分向上取整(即+1);如果是59分的话,分进1变成00,时进1
consumer.accept(ceilSecode);//2018-11-23 11:32:13,截取到分,分向上取整(即+1)

 

DateUtils.ceiling(final Calendar date, final int field)  => 截取日历的部分值,截取的末尾部分向上取整

Calendar calendar = Calendar.getInstance();
DateUtils.ceiling(calendar, Calendar.YEAR);
// ...

 

DateUtils.ceiling(final Object date, final int field) => 截取[日期时间 | 日历]的部分值,截取的末尾部分向上取整

DateUtils.ceiling(calendar, Calendar.YEAR);
// ...

 

// date所指时间是当前月分(年份)的第几天
System.out.println(DateUtils.getFragmentInDays(date, Calendar.YEAR));
DateUtils.getFragmentInDays(calendar, Calendar.YEAR);

// date所指时间是当前月分(年份)的第几小时
System.out.println(DateUtils.getFragmentInHours(date, Calendar.YEAR));
System.out.println(DateUtils.getFragmentInHours(calendar, Calendar.YEAR));

// date所指时间是当前月分(年份)的第几分钟
System.out.println(DateUtils.getFragmentInMinutes(date, Calendar.YEAR));
System.out.println(DateUtils.getFragmentInMinutes(calendar, Calendar.YEAR));

// // date所指时间是当前月分(年份)的第几秒
System.out.println(DateUtils.getFragmentInSeconds(date, Calendar.YEAR));
System.out.println(DateUtils.getFragmentInSeconds(calendar, Calendar.YEAR));

// // date所指时间是当前月分(年份)的第几毫秒
System.out.println(DateUtils.getFragmentInMilliseconds(date, Calendar.YEAR));
System.out.println(DateUtils.getFragmentInMilliseconds(calendar, Calendar.YEAR));

 

设置日期指定字段值

consumer.accept(DateUtils.setYears(date, 2021));
consumer.accept(DateUtils.setMonths(date, 1));
consumer.accept(DateUtils.setDays(date, 1));
consumer.accept(DateUtils.setHours(date, 1));
consumer.accept(DateUtils.setMinutes(date, 1));
consumer.accept(DateUtils.setSeconds(date, 1));
consumer.accept(DateUtils.setMilliseconds(date, 1));

 

DateUtils.isSameDay => 比较年月日是否相等

DateUtils.isSameDay(date, date);


DateUtils.isSameInstant => 比较时间毫秒数是否相等

DateUtils.isSameInstant(date, date);

 

DateUtils.isSameDay => 比较日历年月日是否相等

DateUtils.isSameDay(calendar, calendar);


DateUtils.isSameInstant => 比较日历毫秒数是否相等

DateUtils.isSameInstant(calendar, calendar);


DateUtils.isSameLocalTime => 判断是否是同一个本地时间

DateUtils.isSameLocalTime(calendar, calendar);

 

DateUtils.toCalendar => Date转为Calendar

Calendar calendar1 = DateUtils.toCalendar(date);


DateUtils.toCalendar => Date转为指定时区的Calendar

Calendar calendar2 = DateUtils.toCalendar(date, TimeZone.getTimeZone("Asia/Shanghai"));

DateUtils.round => 截取日期时间的部分值,截取的末尾部分四舍五入,截取部分外的其他部分使用默认初始值(年、月、日、时、分、秒 的默认初始值分别为:0001、01、01、00、00、00)

//Date DateUtils.round(Date date, int field)
Date dateRound = DateUtils.round(date,Calendar.YEAR);


DateUtils.round => 截取日历的部分值,截取的末尾部分四舍五入...

//Date DateUtils.round(Calendar calendar, int field)
Calendar calendarRound = DateUtils.round(calendar, Calendar.YEAR);


DateUtils.round => 截取[日期时间 | 日历]的部分值,截取的末尾部分四舍五入...

//Date DateUtils.round(Object object, int field)
Calendar objectRound = DateUtils.round(calendar, Calendar.YEAR);

 

DateUtils.truncate(Date date, int field) => 截取日期时间的部分值,截取部分外的其他部分使用默认初始值(年、月、日、时、分、秒 的默认初始值分别为:0001、01、01、00、00、00)

Date truncate = DateUtils.truncate(date, Calendar.YEAR);//截取年,而月、日使用初始值01,时、分、秒使用初始值00
// 其它重载方法
// DateUtils.truncate(Calendar calendar, int field)
// DateUtils.truncate(Object object, int field)

 

DateUtils.truncatedCompareTo => 两个日期截取相同的部分进行比较。如果 date1更大(更晚)则返回 1,如果 date2 更大(更晚)则返回 -1 ,如果相等,则返回 0。

DateUtils.truncatedCompareTo(date, date, Calendar.YEAR);
DateUtils.truncatedCompareTo(calendar, calendar, Calendar.YEAR);

 

DateUtils.truncatedEquals => 两个日期截取相同的部分,比较值是否相等。

DateUtils.truncatedEquals(date, date, Calendar.YEAR);
DateUtils.truncatedEquals(calendar, calendar, Calendar.YEAR);

 

DateUtils.iterator(Date focus, int rangeStyle) => 遍历包含日期 focus 所在的 rangeStyle 范围的连续星期的每一天。


DateUtils.parseDate => 将 String 类型的日期数据转换成 Date 类型的日期数据

// 重载方法Date DateUtils.parseDate(final String str, final Locale locale, final String... parsePatterns)
//该方法中,Locale locale 参数指定语言环境,如果为空,则默认为当前系统的语言环境
try {
    DateUtils.parseDate("2019-06-15 22:48:52","yyyy-MM-dd HH:mm:ss");
    // 第二个参数可以有多个,至少一个满足,否则报错
    DateUtils.parseDate("2019-06-15 22:48:52", ArrayUtils.toArray("yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd"));

    DateUtils.parseDate("2019-06-15 22:48:52", Locale.CHINESE,"yyyy-MM-dd HH:mm:ss");
} catch (ParseException e) {
    e.printStackTrace();
}

 

DateUtils.parseDateStrictly() => 跟parseDate作用相同只是他更严格,例子如下

try {
    // 比如,下面的代码也可以解析出Date日期,只不过得到的结果变成了“2019-10-30 00:00:00”,并不是正确的结果。
    Date date2 = DateUtils.parseDate("2019-06-152", "yyyy-MM-dd");
    consumer.accept(date2);
    // 而如果像下面这样写的话,会直接报错java.text.ParseException: Unable to parse the date: 2019-06-152。
    Date date3 = DateUtils.parseDateStrictly("2019-06-152", "yyyy-MM-dd");
    consumer.accept(date3);
} catch (ParseException e) {
    e.printStackTrace();
}

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值