0

我想创建一个 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\n" + date);

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

    System.out.println("\n*** 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\nActual 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
4

2 回答 2

1
于 2017-12-29T05:00:12.870 回答
0

似乎事情在时区上。如果您避开这条线,您的日历是 UTC 并且您的日期是您当地的区域:

calendar.setTimeZone(TimeZone.getTimeZone("UTC"));

事情应该工作。

当您将日历传递给日期时,日期对象会在您的情况下获得默认时区 CET。然后你截断并再次传递到 UTC 日历,由于 CET 和 UTC 之间的差异,你的一天是前一天。

于 2015-02-04T08:50:07.890 回答