wake-up-neo.net

Datumsobjekt in Kalender [Java]

Ich habe eine Klasse Moviein ich habe ein Startdatum, eine Dauer und ein Stoppdatum . Start- und Enddatum sind Datumsobjekte (privates Datum startDate ...) (Es ist eine Zuweisung, also ich Ich kann das stopDate automatisch berechnen, indem ich die Dauer (in min) zum startDate addiere.

Nach meinem Wissen ist das Arbeiten mit den Zeitmanipulationsfunktionen von Date veraltet, daher ist es eine schlechte Praxis, aber auf der anderen Seite sehe ich keine Möglichkeit, das Date-Objekt in ein Kalenderobjekt zu konvertieren, um die Zeit zu manipulieren und in ein Date-Objekt umzuwandeln. .Gibt es einen Weg? Und wenn es das gibt, was Best Practice wäre

65
Samuel

Sie können eine Instanz einer GregorianCalendar erstellen und dann die Date als Startzeit festlegen:

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

Ein anderer Ansatz ist jedoch, Date überhaupt nicht zu verwenden. Sie könnten einen Ansatz wie diesen verwenden:

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

Auf diese Weise können Sie sowohl auf die Startzeit als auch auf die Dauer von Start bis Stopp zugreifen. Die Präzision liegt natürlich bei Ihnen.

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

datum ist ein Java.util.Date-Objekt. Sie können auch Calendar.getInstance () verwenden, um die Kalenderinstanz zu erhalten (wesentlich effizienter).

27
Bozhidar Batsov

Calendar.setTime()

Es ist oft nützlich, sich die Signatur und Beschreibung der API-Methoden anzusehen, nicht nur ihren Namen.

6

Sie müssen dafür nicht in Calendar konvertieren. Sie können stattdessen einfach getTime()/setTime() verwenden.

getTime() : Gibt die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT zurück, die von diesem Date-Objekt dargestellt wird. 

setTime(long time) : Legt fest, dass dieses Date-Objekt einen Zeitpunkt darstellt, der um Millisekunden nach dem 1. Januar 1970 um 00:00:00 GMT liegt. )

Es gibt 1000 Millisekunden in einer Sekunde und 60 Sekunden in einer Minute. Mach einfach die Rechnung.

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

Das Suffix L in 1000 zeigt an, dass es sich um ein long-Literal handelt. Diese Berechnungen laufen normalerweise int leicht über.

6

tl; dr

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

Java.time

Andere Antworten sind korrekt, insbesondere die Antwort von Borgwardt . Diese Antworten verwenden jedoch veraltete Klassen. 

Die ursprünglichen mit Java gebündelten Datumszeit-Klassen wurden durch Java.time-Klassen ersetzt. Führen Sie Ihre Geschäftslogik in Java.time-Typen aus. Konvertieren Sie nur in die alten Typen, wenn dies für die Arbeit mit altem Code erforderlich ist, der noch nicht für die Verarbeitung von Java.time-Typen aktualisiert wurde.

Wenn Ihr Calendar tatsächlich ein GregorianCalendar ist, können Sie in ein ZonedDateTime konvertieren. Suchen Sie nach neuen Methoden, die den alten Klassen hinzugefügt wurden, um die Konvertierung in/von Java.time-Typen zu erleichtern.

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 

Wenn Ihre Calendar keine Gregorian ist, rufen Sie toInstant an, um ein Instant-Objekt abzurufen. Die Klasse Instant repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .

Instant instant = myCal.toInstant();

Wenn Sie mit einem Java.util.Date-Objekt beginnen, konvertieren Sie entsprechend in ein Instant. Die Klasse Instant repräsentiert einen Moment auf der Zeitleiste in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines Dezimalbruchs). 

Instant instant = myUtilDate.toInstant();

Wenden Sie eine Zeitzone an, um ein ZonedDateTime zu erhalten.

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

Um ein Java.util.Date-Objekt zu erhalten, gehen Sie durch Instant.

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

Weitere Informationen zum Konvertieren zwischen den älteren Datum/Uhrzeit-Typen und Java.time und einem praktischen Diagramm finden Sie unter meine Antwort in eine andere Frage.

Duration

Stellen Sie die Zeitspanne als Duration -Objekt dar. Ihre Eingabe für die Dauer ist eine Anzahl von Minuten, wie in der Frage erwähnt.

Duration d = Duration.ofMinutes( yourMinutesGoHere );

Sie können dies zum Start hinzufügen, um den Stopp zu bestimmen.

Instant stop = startInstant.plus( d ); 

Über Java.time

Das Framework Java.time ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Legacy Datum-Zeit-Klassen, wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Projekt Joda-Time , jetzt im Wartungsmodus , empfiehlt die Migration zu Java.time.

Weitere Informationen finden Sie unter Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. Die Spezifikation lautet JSR 310 .

Wo erhalten Sie die Java.time-Klassen? 

  • Java SE 8 und SE 9 und höher
    • Eingebaut. 
    • Teil der Standard-Java-API mit einer mitgelieferten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 und SE 7
    • Ein Großteil der Java.time-Funktionalität wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert.
  • Android

Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

2
Basil Bourque

so etwas wie

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

Hier ein vollständiges Beispiel, wie Sie Ihr Datum in verschiedene Typen umwandeln können:

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