it-roy-ru.com

Дата объекта в календарь [Java]

У меня есть класс Movie в нем у меня есть Дата начала, продолжительность и дата окончания . Дата начала и окончания являются объектами Date (private Date startDate ...) (Это назначение, поэтому я не могу изменить это) теперь я хочу автоматически рассчитать stopDate, добавив продолжительность (в мин) к startDate.

Насколько мне известно, работа с функциями манипулирования временем в Date устарела, следовательно, это плохая практика, но, с другой стороны, я не вижу способа преобразовать объект Date в объект календаря, чтобы манипулировать временем и преобразовать его в объект Date . Есть ли способ? И если есть то, что было бы лучшей практикой

65
Samuel

Что вы можете сделать, это создать экземпляр GregorianCalendar и затем установить Date в качестве времени запуска:

Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);

Однако другой подход заключается в том, чтобы вообще не использовать Date. Вы можете использовать такой подход:

private Calendar startTime;
private long duration;
private long startNanos;   //Nano-second precision, could be less precise
...
this.startTime = Calendar.getInstance();
this.duration = 0;
this.startNanos = System.nanoTime();

public void setEndTime() {
        this.duration = System.nanoTime() - this.startNanos;
}

public Calendar getStartTime() {
        return this.startTime;
}

public long getDuration() {
        return this.duration;
}

Таким образом, вы можете получить доступ как ко времени начала, так и получить продолжительность от начала до конца. Точность зависит от вас, конечно.

95
Lars Andren
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

date является объектом Java.util.Date. Вы также можете использовать Calendar.getInstance (), чтобы получить экземпляр Calendar (гораздо более эффективный).

27
Bozhidar Batsov

Calendar.setTime()

Часто полезно взглянуть на сигнатуру и описание методов API, а не только на их название :) - Даже в стандартном API Java имена иногда могут вводить в заблуждение.

6
Michael Borgwardt

Для этого вам не нужно конвертировать в Calendar, вместо этого вы можете просто использовать getTime()/setTime().

getTime() : Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу, представленное этим объектом Date. 

setTime(long time) : Устанавливает этот объект Date для представления момента времени, который является временем в миллисекундах после 1 января 1970 года 00:00:00 по Гринвичу. )

1000 секунд в секунду и 60 секунд в минуту. Просто сделай математику.

    Date now = new Date();
    Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
    System.out.println(now);
    System.out.println(oneMinuteInFuture);

Суффикс L в 1000 означает, что это литерал long; эти вычисления обычно переполняются int легко.

6
polygenelubricants

тЛ; др

Instant stop = 
    myUtilDateStart.toInstant()
                   .plus( Duration.ofMinutes( x ) ) 
;

Java.time

Другие ответы верны, особенно Ответ Боргвардта . Но эти Ответы используют устаревшие классы. 

Оригинальные классы даты и времени, связанные с Java, были заменены классами Java.time. Выполните свою бизнес-логику в типах Java.time. Преобразуйте в старые типы только там, где это необходимо для работы со старым кодом, который еще не обновлен для обработки типов Java.time.

Если ваш Calendar на самом деле является GregorianCalendar вы можете преобразовать в ZonedDateTime. Найдите новые методы, добавленные к старым классам, чтобы облегчить преобразование в/из типов Java.time.

if( myUtilCalendar instanceof GregorianCalendar ) {
    GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
    ZonedDateTime zdt = gregCal.toZonedDateTime();  // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if 

Если ваш Calendar не является Gregorian, вызовите toInstant , чтобы получить объект Instant. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд .

Instant instant = myCal.toInstant();

Аналогично, если вы начинаете с объекта Java.util.Date, преобразуйте его в Instant. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби). 

Instant instant = myUtilDate.toInstant();

Примените часовой пояс, чтобы получить ZonedDateTime .

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

Чтобы получить объект Java.util.Date, пройдите Instant.

Java.util.Date utilDate = Java.util.Date.from( zdt.toInstant() );

Для получения дополнительной информации о преобразовании между устаревшими типами даты и времени и Java.time и изящной диаграммой см. мой ответ на другой вопрос.

Duration

Представляет промежуток времени как Duration объект. Ваш ввод для продолжительности составляет количество минут, как указано в Вопросе.

Duration d = Duration.ofMinutes( yourMinutesGoHere );

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

Instant stop = startInstant.plus( d ); 

О Java.time

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

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

Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация это JSR 310 .

Где взять классы Java.time? 

  • Java SE 8 и SE 9 и более поздние версии
    • Встроенный. 
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности Java.time перенесена в Java 6 & 7 в ThreeTen-Backport .
  • Android

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

2
Basil Bourque

что-то вроде

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
0
Xorty

Вот полный пример того, как преобразовать вашу дату в разные типы:

Date date = Calendar.getInstance().getTime();

    // Display a date in day, month, year format
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String today = formatter.format(date);
    System.out.println("Today : " + today);

    // Display date with day name in a short format
    formatter = new SimpleDateFormat("EEE, dd/MM/yyyy");
    today = formatter.format(date);
    System.out.println("Today : " + today);

    // Display date with a short day and month name
    formatter = new SimpleDateFormat("EEE, dd MMM yyyy");
    today = formatter.format(date);
    System.out.println("Today : " + today);

    // Formatting date with full day and month name and show time up to
    // milliseconds with AM/PM
    formatter = new SimpleDateFormat("EEEE, dd MMMM yyyy, hh:mm:ss.SSS a");
    today = formatter.format(date);
    System.out.println("Today : " + today);
0
Vitor Reais