Дата объекта в календарь [Java] - PullRequest
66 голосов
/ 28 апреля 2010

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

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

Ответы [ 7 ]

96 голосов
/ 28 апреля 2010

Что вы можете сделать, это создать экземпляр 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;
}

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

27 голосов
/ 28 апреля 2010
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

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

6 голосов
/ 28 апреля 2010

Для этого вам не нужно конвертировать в 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 голосов
/ 28 апреля 2010

Calendar.setTime()

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

2 голосов
/ 20 августа 2016

ТЛ; др

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 встроена в 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 .

0 голосов
/ 17 июля 2018

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

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 голосов
/ 28 апреля 2010

что-то вроде

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...