Во-первых, имейте в виду, что эта операция зависит от часового пояса. Так что выберите, хотите ли вы сделать это в UTC, в часовом поясе компьютера, в своем любимом часовом поясе или где. Если вы еще не уверены, что это важно, посмотрите мой пример внизу этого ответа.
Поскольку ваш вопрос не совсем ясен по этому поводу, я предполагаю, что у вас есть класс с полем экземпляра, представляющим момент времени и реализующий Comparable
, и вы хотите, чтобы естественное упорядочение ваших объектов осуществлялось с помощью дата, но не время этого поля. Например:
public class ArnesClass implements Comparable<ArnesClass> {
private static final ZoneId arnesTimeZone = ZoneId.systemDefault();
private Instant when;
@Override
public int compareTo(ArnesClass o) {
// question is what to put here
}
}
Java 8 java.time
классы
Я взял на себя свободу изменить тип поля вашего экземпляра с Date
на Instant
, соответствующий класс в Java 8. Я обещаю вернуться к обработке Date
ниже. Я также добавил постоянную часового пояса. Вы можете установить его на ZoneOffset.UTC
или ZoneId.of("Europe/Stockholm")
или на то, что считаете нужным (установка на ZoneOffset
работает, потому что ZoneOffset
является подклассом ZoneId
).
Я решил показать решение с использованием классов Java 8. Вы просили самый простой способ, верно? :-) Вот метод compareTo
, который вы просили:
public int compareTo(ArnesClass o) {
LocalDate dateWithoutTime = when.atZone(arnesTimeZone).toLocalDate();
LocalDate otherDateWithoutTime = o.when.atZone(arnesTimeZone).toLocalDate();
return dateWithoutTime.compareTo(otherDateWithoutTime);
}
Если вам никогда не нужна временная часть when
, конечно, легче объявить when
a LocalDate
и пропустить все преобразования. Тогда нам больше не нужно беспокоиться о часовом поясе.
Теперь предположим, что по какой-то причине вы не можете объявить свое when
поле Instant
или хотите оставить его старомодным Date
. Если вы все еще можете использовать Java 8, просто преобразуйте его в Instant
, а затем сделайте как раньше:
LocalDate dateWithoutTime = when.toInstant().atZone(arnesTimeZone).toLocalDate();
Аналогично для o.when
.
Нет Java 8?
Если вы не можете использовать Java 8, есть два варианта:
- Решите это, используя один из старых классов,
Calendar
или SimpleDateFormat
.
- Используйте бэкпорт классов даты и времени Java 8 для Java 6 и 7, затем сделайте то же, что и выше. Я включаю ссылку внизу. Не используйте JodaTime. JodaTime был, вероятно, хорошим предложением, когда ответы, рекомендующие его, были написаны; но JodaTime сейчас находится в режиме обслуживания, поэтому бэкпорт ThreeTen является лучшим и более перспективным вариантом.
Старомодные способы
Ответ Адамски показывает, как убрать часть времени с Date
, используя класс Calendar
. Я предлагаю вам использовать getInstance(TimeZone)
, чтобы получить Calendar
экземпляр для часового пояса, который вы хотите. В качестве альтернативы вы можете использовать идею второй половины ответа Йорна .
Использование SimpleDateFormat
на самом деле является косвенным способом использования Calendar
, поскольку SimpleDateFormat
содержит объект Calendar
. Тем не менее, вы можете найти это менее проблематичным, чем прямое использование Calendar
:
private static final TimeZone arnesTimeZone = TimeZone.getTimeZone("Europe/Stockholm");
private static final DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
static {
formatter.setTimeZone(arnesTimeZone);
}
private Date when;
@Override
public int compareTo(ArnesClass o) {
return formatter.format(when).compareTo(formatter.format(o.when));
}
Это было вдохновлено Ответом Роба .
Зависимость от часового пояса
Почему мы должны выбирать определенный часовой пояс? Скажем, мы хотим сравнить два раза, что в UTC 24 марта 0:00 (полночь) и 12:00 (полдень). Если вы сделаете это в CET (скажем, Европа / Париж), это будет 1 час ночи и 1 час дня 24 марта, то есть в тот же день. В Нью-Йорке (по восточному поясному времени) они наступают в 20:00 23 марта и в 8:00 24 марта, то есть не в одну дату. Так что важно, какой часовой пояс вы выберете. Если вы просто полагаетесь на настройки компьютера по умолчанию, вас могут удивить неожиданные попытки запуска вашего кода на компьютере в другом месте в этом глобализированном мире.
Link
Ссылка на ThreeTen Backport, бэкпорт классов даты и времени Java 8 для Java 6 и 7: http://www.threeten.org/threetenbp/.