Как получить часть даты (избавиться от части времени) от java.util.Date? - PullRequest
4 голосов
/ 30 сентября 2011

Я хочу сравнить часть даты двух java.util.Date объектов.Как мне этого добиться?Я не хочу сравнивать дату, месяц и год отдельно.

Заранее спасибо!

Ответы [ 5 ]

4 голосов
/ 30 сентября 2011

DateUtils от commons-lang предоставляют хорошее решение этой проблемы:

посмотрите это

С этим вы можете сравнить два Date экземпляра в одной строкетеряя из виду каждую часть Date, которую вы хотите.

Date date1 = new Date(2011, 8, 30, 13, 42, 15);
    Date date2 = new Date(2011, 8, 30, 15, 23, 46);
    int compareTo = DateUtils.truncatedCompareTo(date1, date2,
            Calendar.DAY_OF_MONTH);

В этом примере значение compareTo равно 0.

3 голосов
/ 30 сентября 2011

A Date - это мгновение во времени. Это действительно «означает» что-либо с точки зрения даты, когда вы применяете к ней календарь и часовой пояс. Таким образом, вы действительно должны смотреть на Calendar, если вы хотите придерживаться стандартного Java API - вы можете создать Calendar объект с правильным Date и часовым поясом, а затем установить временные компоненты на 0.

Однако было бы лучше использовать Joda Time для начала и его тип LocalDate, который более точно отражает то, что вас интересует.

2 голосов
/ 30 сентября 2011

Использование Calendar.set() с Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND и Calendar.MILLISECOND чтобы установить все эти поля в 0.

Ответы на этот дублирующий вопрос будут полезны: Сброс временной части временной метки в Java

1 голос
/ 22 августа 2016

tl; dr

LocalDate ld = 
    myUtilDate.toInstant()
              .atZone( ZoneId.of( "America/Montreal" ) )
              .toLocalDate() ;

Избегайте устаревших классов даты и времени

Вы используете проблемные старые классы даты и времени.Избежать их.

Вместо этого используйте java.time классы.Они вытесняют старые классы, а также библиотеку Joda-Time.

Преобразование

Преобразование java.util.Date в Instant.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд .

Instant instant = myUtilDate.toInstant();

Часовой пояс

Применение часового пояса.Часовой пояс имеет решающее значение.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париже Франция - новый день, а в Монреале - Квебеке «вчера».

Примените ZoneId, чтобы получить объект ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

Local… Типы

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.Аналогично, LocalTime представляет время суток без даты и без часового пояса.Вы можете рассматривать их как два компонента, которые вместе с ZoneId составляют ZonedDateTime.Вы можете извлечь их из ZonedDateTime.

LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();

Strings

Если ваша цель - просто генерировать Strings для представления пользователю, нет необходимости в типах Local….Вместо этого используйте DateTimeFormatter для генерации строк, представляющих только часть даты или часть времени.Этот класс достаточно умен, чтобы автоматически локализовать при генерации строки.

Укажите Locale, чтобы определить (а) человеческий язык, используемый для перевода названия дня, название месяца и тому подобное, и (б) культурные нормы для решения таких вопросов, как аббревиатура, заглавные буквы, знаки препинания и тому подобное.

Locale l = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.

DateTimeFormatter fDate = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
String outputDate = zdt.format( fDate );

DateTimeFormatter fTime = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale );
String outputTime = zdt.format( fTime );

О java.time

The java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date, .Calendar и & java.text.SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial .И найдите в Stack Overflow множество примеров и объяснений.

Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android in ThreeTenABP (см. Как использовать… ).

Проект ThreeTen-Extra расширяет Java. время с дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.

1 голос
/ 10 июля 2015

Найдите ниже решение, которое использует Joda Time и поддерживает часовые пояса.Поэтому вы получите дату и время (в currentDate и currentTime) в текущем настроенном часовом поясе в JVM.

Обратите внимание, что Joda Time не поддерживает високосных секунд .Таким образом, вы можете быть на 26 или 27 секунд меньше истинного значения.Вероятно, это будет решено только в течение следующих 50 лет, когда накопленная ошибка будет ближе к 1 минуте, и люди начнут заботиться об этом.

См. Также: https://en.wikipedia.org/wiki/Leap_second

/**
 * This class splits the current date/time (now!) and an informed date/time into their components:
 * <lu>
 *     <li>schedulable: if the informed date/time is in the present (now!) or in future.</li>
 *     <li>informedDate: the date (only) part of the informed date/time</li>
 *     <li>informedTime: the time (only) part of the informed date/time</li>
 *     <li>currentDate: the date (only) part of the current date/time (now!)</li>
 *     <li>currentTime: the time (only) part of the current date/time (now!)</li>
 * </lu>
 */
public class ScheduleDateTime {
    public final boolean schedulable;
    public final long millis;
    public final java.util.Date informedDate;
    public final java.util.Date informedTime;
    public final java.util.Date currentDate;
    public final java.util.Date currentTime;

    public ScheduleDateTime(long millis) {
        final long now = System.currentTimeMillis();
        this.schedulable = (millis > -1L) && (millis >= now);

        final TimeZoneUtils tz = new TimeZoneUtils();

        final java.util.Date          dmillis   = new java.util.Date( (millis > -1L) ? millis : now );
        final java.time.ZonedDateTime zdtmillis = java.time.ZonedDateTime.ofInstant(dmillis.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdmillis  = java.util.Date.from(tz.tzdate(zdtmillis));
        final java.util.Date          ztmillis  = new java.util.Date(tz.tztime(zdtmillis));

        final java.util.Date          dnow   = new java.util.Date(now);
        final java.time.ZonedDateTime zdtnow = java.time.ZonedDateTime.ofInstant(dnow.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdnow  = java.util.Date.from(tz.tzdate(zdtnow));
        final java.util.Date          ztnow  = new java.util.Date(tz.tztime(zdtnow));

        this.millis       = millis;
        this.informedDate = zdmillis;
        this.informedTime = ztmillis;
        this.currentDate  = zdnow;
        this.currentTime  = ztnow;
    }
}



public class TimeZoneUtils {

    public java.time.Instant tzdate() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tzdate(zdtime);
    }
    public java.time.Instant tzdate(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final java.time.Instant instant = zddate.toInstant();
        return instant;
    }

    public long tztime() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tztime(zdtime);
     }
    public long tztime(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final long millis = zddate.until(zdtime, java.time.temporal.ChronoUnit.MILLIS);
        return millis;
    }
}
...