Obiekt Date do kalendarza [Java]

Mam film klasowy w nim mam datę rozpoczęcia, czas trwania i datę zatrzymania. Data Start i stop są obiektami Date (prywatna data startDate ...) (Jest to zadanie więc nie mogę tego zmienić) teraz chcę automatycznie obliczyć stopDate dodając czas trwania (W min) do daty rozpoczęcia.

Według mojej wiedzy praca Z FUNKCJAMI manipulującymi czasem daty jest przestarzała, stąd zła praktyka, ale z drugiej strony nie widzę sposobu na przekonwertowanie obiektu daty NA obiekt kalendarza w celu manipulowania czasem i rekonwertowania go do obiektu daty. Jest jakiś sposób? A jeśli jest to, co byłoby najlepszą praktyką

Author: Suragch, 2010-04-28

7 answers

Możesz utworzyć instancję GregorianCalendar, a następnie ustawić Date jako czas rozpoczęcia:

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

Jednak innym podejściem jest nie używać Date w ogóle. Przydałoby się takie podejście:

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;
}

W ten sposób możesz uzyskać zarówno czas rozpoczęcia, jak i czas trwania od rozpoczęcia do zakończenia. Precyzja zależy oczywiście od Ciebie.

 100
Author: Lars Andren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-14 11:37:56
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

Data to java.util.Obiekt daty. Możesz użyć kalendarza.getInstance (), jak również w celu uzyskania instancji kalendarza (o wiele bardziej wydajnej).

 27
Author: Bozhidar Batsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 19:54:32

Calendar.setTime()

Często warto przyjrzeć się podpisowi i opisowi metod API, a nie tylko ich nazwie:) - nawet w standardowym API Javy nazwy mogą czasem wprowadzać w błąd.

 6
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 08:04:57

Nie musisz konwertować na Calendar, możesz po prostu użyć getTime()/setTime() zamiast tego.

getTime(): Zwraca liczbę milisekund od 1 stycznia 1970, 00: 00: 00 GMT reprezentowaną przez ten obiekt Date.

setTime(long time) : ustawia ten obiekt Date, aby reprezentował punkt w czasie, który jest milisekundami czasu po 1 stycznia 1970 00: 00: 00 GMT. )

Jest 1000 milisekund w sekundę, i 60 sekund w minutę. Po prostu zrób matematyka.

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

Przyrostek L W 1000 oznacza, że jest to literał long; te obliczenia Zwykle przepełniają int łatwo.

 6
Author: polygenelubricants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 08:08:50

Tl;dr

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

Java.czas

Inne odpowiedzi są poprawne, szczególnieodpowiedź Borgwardta . Ale te odpowiedzi używają przestarzałych klas.

Oryginalne klasy date-time w pakiecie z Javą zostały zastąpione przez Javę.zajęcia czasowe. Wykonaj swoją logikę biznesową w Javie.typy czasu. Konwertuj na Stare typy tylko tam, gdzie jest to potrzebne do pracy ze starym kodem, który nie został jeszcze zaktualizowany do obsługi Javy.typy czasu.

Jeśli twój Calendar jest faktycznie GregorianCalendar można przekonwertować na ZonedDateTime. Znajdź nowe metody dodane do starych klas, aby ułatwić konwersję do / Z Javy.typy czasu.

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 

Jeśli Twoje Calendar nie jest Gregorian, zadzwoń toInstant aby uzyskać Instant obiekt. Na Instant Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund.

Instant instant = myCal.toInstant();

Podobnie, jeśli zaczyna się od java.util.Date obiektu, przekonwertuj na Instant. Na Instant Klasa A moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).

Instant instant = myUtilDate.toInstant();

Zastosuj strefę czasową, aby uzyskać ZonedDateTime.

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

Aby uzyskać java.util.Date obiekt, przejdź przez Instant.

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

W celu omówienia konwersji pomiędzy starszymi typami daty i czasu a Javą.czas, i sprytny diagram, zobacz moja odpowiedź na inne pytanie.

Duration

Reprezentują rozpiętość czas jako Duration obiekt. Twoje dane wejściowe na czas trwania to liczba minut, jak wspomniano w pytaniu.

Duration d = Duration.ofMinutes( yourMinutesGoHere );

Możesz dodać to do początku, aby określić przystanek.

Instant stop = startInstant.plus( d ); 

O Javie.czas

Java.Framework time jest wbudowany w Javę 8 i nowszą. Klasy te zastępują kłopotliwe stare dziedzictwo klasy date-time, takie jak java.util.Date, Calendar, & SimpleDateFormat.

The projekt Joda-Time, teraz w trybie konserwacji , radzi migrację do Javy.czas.

Aby dowiedzieć się więcej, Zobacz samouczek Oracle. I wyszukaj przepełnienie stosu dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Skąd pobrać Javę.zajęcia czasowe?

  • Java SE 8 oraz SE 9 i Później
    • Wbudowany.
    • część standardowego API Java z pakietową realizacją.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 oraz SE 7
    • Większość Javy.funkcja czasu powraca-przeportowana do Javy 6 i 7 w ThreeTen-Backport.
  • Android

Projekt ThreeTen-Extra rozszerza Javę.czas z dodatkowymi zajęciami. Ten projekt jest poligonem dla potencjalnych przyszłych dodatków do Javy.czas. Możesz znaleźć tutaj kilka przydatnych klas, takich jak Interval, YearWeek, YearQuarter, i więcej .

 2
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:10

Coś jak

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
 0
Author: Xorty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-28 08:11:00

Oto pełny przykład jak przekształcić datę w różnych typach:

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
Author: Vitor Reais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 14:50:29