0

我有一个 java.util.Date,我正在使用 org.apache.commons.lang.time#truncate(javaUtilDateObj, Calendar.DATE) 将日期转换为午夜。

问题是 UTC 日期以本地时区表示,而 truncate 方法只是将小时、分钟和秒转换为 00:00:00 而不考虑时区。

示例:- 说 UTC 时间是从纪元开始的 30 秒。Wed Dec 31 19:00:30 EST 1969 是我看到的 Date 对象表示。在上述日期调用 DateUtils#truncate() 方法时,输出为 Wed Dec 31 00:00:00 EST 1969。

我所期待的是,如果 UTC 时间距离纪元 30 秒。如果这可以表示/转换为 1970 年 1 月 1 日星期四 00:00:30 EST 1970,我可以调用 DateUtils#truncate() 方法并期望 1970 年 1 月 1 日星期四 00:00:00 EST 1970。

注意:我无法使用 joda-time API,因此我被我所拥有的东西困住了。

4

4 回答 4

0

使用以下Calendar版本truncate

Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC")).setTime(date);
Calendar midnight = DateUtils.truncate(utc, Calendar.HOUR_OF_DAY);
Date midnightDate = midnight.getTime();
于 2015-02-01T19:54:02.373 回答
0
Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
utc.setTime(date);
Calendar midnight = DateUtils.truncate(utc, Calendar.HOUR_OF_DAY);
Date midnightDate = midnight.getTime();
于 2015-05-21T12:17:09.657 回答
0

如果您的数据层保存 UTC 时间但您的表示层有不同的时区并且您需要截断日期进行过滤,则以下功能很有用。

/**
 * Truncates the given UTC date for the given TimeZone
 *
 * @param date UTC date
 * @param timeZone Target timezone
 * @param field Calendar field
 *
 * @return
 */
public static Date truncate(Date date, final TimeZone timeZone, final int field)
{
    int timeZoneOffset = timeZone.getOffset(date.getTime());

    // convert UTC date to target timeZone
    date = DateUtils.addToDate(date, Calendar.MILLISECOND, timeZoneOffset);

    // truncate in target TimeZone
    date = org.apache.commons.lang3.time.DateUtils.truncate(date, field);

    // convert back to UTC
    date = DateUtils.addToDate(date, Calendar.MILLISECOND, -timeZoneOffset);

    return date;
}

/**
 * Adds the given amount to the given Calendar field to the given date.
 *
 * @see Calendar
 *
 * @param date the date
 * @param field the calendar field to add to
 * @param amount the amount to add, may be negative
 *
 * @return
 */
public static Date addToDate(final Date date, final int field, final int amount)
{
    Objects.requireNonNull(date, "date must not be null");

    final Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.add(field, amount);
    return c.getTime();
}
于 2018-08-19T17:46:51.517 回答
0
于 2018-02-10T07:28:26.013 回答