Apache DateUtils会截断每月的日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache DateUtils会截断每月的日期相关的知识,希望对你有一定的参考价值。

我想创建一个DateHelper类,为此我使用Apache Commons Lang 2.6中的DateUtils。我在理解从日期中提取字段时返回的结果时遇到问题。这是我的测试类,它在截断日期后提取日期:

    public class DateTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
//      Date date = createDate(2000, 1, 2, 3, 4, 5, 6);

        Calendar calendar = createEmptyUTCCalendar();
        calendar.set(Calendar.YEAR, 2000);
        calendar.set(Calendar.MONTH, 0); // january
        calendar.set(Calendar.DAY_OF_MONTH, 2);
        calendar.set(Calendar.HOUR_OF_DAY, 3);
        calendar.set(Calendar.MINUTE, 4);
        calendar.set(Calendar.SECOND, 5);
        calendar.set(Calendar.MILLISECOND, 6);

        Date date = calendar.getTime();
    System.out.println("Input date
" + date);

    // Truncate from day of month.
    Date dateTruncate = getDatePart(date);
    System.out.println("Truncate the date
" + dateTruncate);

    System.out.println("
*** Extract day of month ***");
    // Extract the field day of month from the truncated date.
    int fieldDayOfMonth = getField(dateTruncate, Calendar.DAY_OF_MONTH);
    System.out.println("Expected result is 2
Actual result is " + fieldDayOfMonth);

        assert fieldDayOfMonth == 2;
    }

     public static int getField(Date date, int calendarField) {
        Calendar calendar = createEmptyUTCCalendar();
        calendar.setTime(date);
        int value = calendar.get(calendarField);
        if (calendarField == Calendar.MONTH) {
            value++;
        }
        return value;
    }

    public static Date getDatePart(Date date) {
        return DateUtils.truncate(date, Calendar.DAY_OF_MONTH);
    }

    private static Calendar createEmptyUTCCalendar() {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
        return calendar;
    }
}

我希望将Calendar.DAY_OF_MONTH字段提取的结果为2,但我得到1。

Input date
Sun Jan 02 04:04:05 CET 2000
Truncate the date
Sun Jan 02 00:00:00 CET 2000

*** Extract day of month ***
Expected result is 2
Actual result is 1
答案

tl;dr

LocalDate.of( 2000 , Month.JANUARY , 2 )
         .getDayOfMonth() 

2

java.time

您现在可以只使用Java,不需要Apache DateUtils。截断是错误的思考方式;只是询问一天的财产。

使用LocalDate类指定日期。请注意,java.time使用合理的月份编号,1-12表示1月到12月。

LocalDate ld = LocalDate.of( 2000 , 1 , 2 ) ;  // January 2, 2000.

或者使用Month枚举。

LocalDate ld = LocalDate.of( 2000 , Month.JANUARY , 2 ) ;  // January 2, 2000.

2000-01-02

询问每月的日期。你可以在qazxsw poi,qazxsw poi和qazxsw poi上打电话给qazxsw poi。

getDayOfMonth

2

如果接收LocalDate对象,它可能是OffsetDateTime。如果是这样,您可以轻松转换为java.time类。

ZonedDateTime

About java.time

int dayOfMonth = ld.getDayOfMonth​() ; 框架内置于Java 8及更高版本中。这些类取代了麻烦的旧Calendar日期时间类,如GregorianCalendarif( myCalendar instanceOf GregorianCalendar ) { GregorianCalendar gc = ( GregorianCalendar ) myCalendar ; // Cast. ZonedDateTime zdt = gc.toZonedDateTime() ; // Convert from legacy class to modern class. int dayOfMonth = zdt.getDayOfMonth​() ; } java.time

现在在legacyjava.util.Date项目建议迁移到Calendar班。

要了解更多信息,请参阅SimpleDateFormat。并搜索Stack Overflow以获取许多示例和解释。规格是Joda-Time

从哪里获取java.time类?

ThreeTen-Backport项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如AndroidThreeTenABPHow to use ThreeTenABP…ThreeTen-Extra

另一答案

似乎事情发生在时区。如果您避开该行,您的日历将以UTC和您当地区域的日期为准:

Interval

事情应该有效。

将日历传递给Date时,日期对象将获得您的案例中的默认时区CET。然后你截断并再次传递给UTC日历,由于CET和UTC之间的差异,你今天就是前一天。

以上是关于Apache DateUtils会截断每月的日期的主要内容,如果未能解决你的问题,请参考以下文章

转apache DateFormatUtils 与 DateUtils 的使用

DateUtils日期处理常用方法集合

使用DateUtils和DateFormatUtils处理时间日期转换与SimpleDateFormat的区别

10.22 使用DateUtils对日期进行数学运算

java日期的运用(DateUtils工具类)

获取当前日期前多少天,或者格式化当前日期