【日期工具类】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
    评论
### 回答1: "java.text.parseexception: unparsable date" 这个错误信息表示在使用Java程序中的"SimpleDateFormat"类解析日期字符串时出现了问题,导致无法解析该日期字符串。可能的原因有:日期字符串的格式不符合SimpleDateFormat中指定的格式,或者日期字符串本身有误。 ### 回答2: rsable date的错误信息是什么? Java.text.parseexception: unparseable date的错误信息通常出现在处理日期格式时出现问题的情况下。具体来讲,当程序试图解析一个无法识别的日期字符串时,就会抛出这个异常。 造成这个错误的原因很多,比如日期格式不正确、解析方法不对、日期字符串与解析方法的格式不匹配等等。为了解决这个问题,我们需要先确定出错的具体原因,然后再进行相应的修复。 首先,我们需要确认日期字符串的格式是否正确。不同的日期格式需要使用不同的解析方法,如果我们使用的是不同格式的解析方法,就会出现上述错误信息。例如,如果我们想解析的日期是“2022年1月1日”,但是程序中使用了“yyyy-MM-dd”的解析方法,这时就相当于用了错误的方法,解析结果是错误的。 其次,我们需要确认解析方法是否正确。Java提供了多种日期解析方法,如SimpleDateFormat、DateTimeFormatter等,我们需要选择正确的解析方法,才能正常解析日期字符串。例如,如果使用SimpleDateFormat解析日期字符串,需要使用正确的格式串,否则就会出现格式不匹配的错误。 最后,我们需要考虑如何处理解析失败的情况。当程序遇到无法解析的日期字符串时,通常会抛出异常,我们需要通过try-catch语句来捕获这个异常,然后给用户一个提示或者采取相应的处理措施。 总之,对于Java.text.parseexception: unparseable date的错误信息,我们需要仔细分析错误的原因,然后针对性地进行修复。只有这样才能确保程序正常运行,避免出现这种异常。 ### 回答3: 首先,java.text.ParseException是Java编程语言中的一个异常类,表示在使用SimpleDateFormat类时,出现了无法解析日期或时间字符串的异常情况。这种异常通常出现在日期或时间字符串与SimpleDateFormat类中设置的日期/时间模式不匹配的情况下。 "unpa"是ParseException类中的一个属性,表示未解析的内容。在打印ParseException实例的堆栈跟踪时,该属性通常会出现,以帮助开发人员定位解析错误的位置。 例如,如果在解析日期字符串时,指定的模式为“yyyy-MM-dd”,但实际上时间字符串中的月份用了字母缩写则会导致ParseException异常,其中的unpa属性将显示未解析的内容,即日期字符串中的月份缩写。 为避免出现ParseException异常,建议在使用SimpleDateFormat类时,始终使用正确的日期/时间模式,并确保待解析的日期/时间字符串与该模式完全匹配。另外,对于复杂的日期格式,也可以考虑使用其他第三方库进行解析,比如Joda-Time等。 需要注意的是,虽然ParseException是Java编程语言中的异常类,但其同样适用于其他一些编程语言中的日期/时间解析操作,比如Python、PHP等。在这些编程语言中,类似的异常通常都会提供类似的错误信息,以帮助开发人员快速定位解析错误的位置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值