Рубрики
Без рубрики

Получить дату без времени на Java

Посмотрите, как получить значение даты без времени на Java

Автор оригинала: Marcos Lopez Gonzalez.

Получить дату без времени на Java

1. Введение

В этом коротком учебнике мы покажем, как получить Дата без времени на Java.

Мы покажем, как это сделать до и после Java 8, так как все стало немного по-другому после выпуска нового API времени на Java 8.

2. Перед Java 8

До Java 8 не было прямого способа получить Дата без времени, если мы не использовали сторонние библиотеки, такие как Joda-time.

Это потому, Дата класс в Java является представлением определенного момента во времени, выраженного в миллисекундах . Таким образом, это делает невозможным игнорировать время на Дата .

В следующих разделах мы покажем некоторые общие обходные пути для решения этой проблемы.

2.1. Использование календаря

Один из наиболее распространенных способов получить Дата без времени, чтобы использовать Календарь класс, чтобы установить время до нуля . Делая это, мы получаем чистую дату, со временем, установленным в начале дня.

Давайте посмотрим его в коде:

public static Date getDateWithoutTimeUsingCalendar() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}

Если мы назовем этот метод мы получаем дату, как это:

Sat Jun 23 00:00:00 CEST 2018

Как мы видим, он возвращает полную дату со временем, установленным до нуля, но мы не можем игнорировать время, .

Кроме того, чтобы убедиться, что нет времени, установлено в Дата вернулся, мы можем создать следующий тест:

@Test
public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() {
    Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar();

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dateWithoutTime);
    int day = calendar.get(Calendar.DAY_OF_MONTH);

    calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY - 1);
    assertEquals(day, calendar.get(Calendar.DAY_OF_MONTH));

    calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY);
    assertNotEquals(day, calendar.get(Calendar.DAY_OF_MONTH));
}

Как мы видим, когда мы добавляем к дате миллисекунды дня минус один мы все еще получаем тот же день, но когда мы добавляем полный день мы получаем на следующий день.

2.2. Использование Formatter

Другой способ сделать это, форматирование Дата в Струнные без времени, а затем преобразовать этот Струнные вернуться к Дата . С Струнные был отформатирован без времени Дата преобразуется будет иметь время, установленное до нуля.

Давайте реализуем его, чтобы увидеть, как это работает:

public static Date getDateWithoutTimeUsingFormat() 
  throws ParseException {
    SimpleDateFormat formatter = new SimpleDateFormat(
      "dd/MM/yyyy");
    return formatter.parse(formatter.format(new Date()));
}

Эта реализация возвращается так же, как метод, показанный в предыдущем разделе:

Sat Jun 23 00:00:00 CEST 2018

Опять же, мы можем использовать тест, как мы делали раньше, чтобы убедиться, что нет времени в Дата возвращаемый.

3. Использование Java 8

С выпуском нового API времени в Java 8, есть более простой способ получить дату без времени. Одна из новых функций, которые принес этот новый API, заключается в том, что существует несколько классов для работы с датами с или без времени, или даже для работы только со временем.

Ради этой статьи, мы сосредоточимся на классе Местное , который представляет собой именно то, что нам нужно, дата без времени.

Давайте посмотрим на него с этим примером:

public static LocalDate getLocalDate() {
    return LocalDate.now();
}

Этот метод возвращает Местное объект с этим представлением даты:

2018-06-23

Как мы видим, он возвращает только дату, время полностью игнорируется .

Опять же, давайте проверить его, как и прежде, чтобы убедиться, что этот метод работает, как ожидалось:

@Test
public void whenGettingLocalDate_thenReturnDateWithoutTime() {
    LocalDate localDate = DateWithoutTime.getLocalDate();

    long millisLocalDate = localDate
      .atStartOfDay()
      .toInstant(OffsetDateTime
        .now()
        .getOffset())
      .toEpochMilli();

    Calendar calendar = Calendar.getInstance();

    calendar.setTimeInMillis(
      millisLocalDate + MILLISECONDS_PER_DAY - 1);
    assertEquals(
      localDate.getDayOfMonth(), 
      calendar.get(Calendar.DAY_OF_MONTH));

    calendar.setTimeInMillis(millisLocalDate + MILLISECONDS_PER_DAY);
    assertNotEquals(
      localDate.getDayOfMonth(), 
      calendar.get(Calendar.DAY_OF_MONTH));
}

4. Заключение

В этой статье мы показали, как получить Дата без времени на Java. Мы впервые показали, как это сделать до Java 8, а также с помощью Java 8.

Как мы могли видеть в примерах, реализованных в статье, используя Java 8 всегда должен быть предпочтительным вариантом , так как он имеет конкретное представление для работы с датами без времени.

Как всегда, полный исходный код примеров доступен более на GitHub .