2016-08-07 46 views
0

Ich möchte zwei verschiedene Zeitstempel mit System.currentTimeMillis() vergleichen.Vergleichen System.currentTimeMillis()

Grundsätzlich möchte ich überprüfen, ob die Zeitstempel innerhalb von 3 Stunden an einem bestimmten Tag liegen.

Wie geht das?

+1

Können Sie * an einem bestimmten Tag * erweitern? Timestamp haben nicht den Begriff "Tag", Sie brauchen auch eine Zeitzone. Was sollte passieren, wenn Sie in einer bestimmten Zeitzone den 7. August um 1 Uhr morgens und den 6. August um 23 Uhr abends haben? – Tunaki

+0

Ah, natürlich sollte der Kommentar oben lesen * und 6. August 11PM * ... – Tunaki

+0

long time1, time2. ((Zeit1 - Zeit2)/(60 * 60)) // Sekunden * Minuten. sollte das Stundenintervall zwischen ihnen erhalten –

Antwort

4

Betrachtet man time1 und time2, wo time1 <= time2 Sie dies tun können:

if (time1 >= time2-(60*60*3*1000)) { 
    // interval is up to 3 hours 
} else { 
    // interval is more than 3 hours 
} 
0

Verwenden Instant die Zeit in der Epoche zu erhalten und wandeln es in LocalDateTime die Informationen über den Tag zu kommen und überprüfen, ob das erste Mal plus 3 Stunden ist kleiner als das zweite Mal: ​​

long millis1 = System.currentTimeMillis(); 
... 
long millis2 = System.currentTimeMillis(); 

Instant instant1 = Instant.EPOCH.plusMillis(millis1); 
Instant instant2 = Instant.EPOCH.plusMillis(millis2); 

LocalDateTime t1 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()); 
LocalDateTime t2 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault()); 

System.out.println("same day: " + (t1.getDayOfYear() == t2.getDayOfYear())); 
System.out.println("t1+3h >= t2: " + (t1.plusHours(3).compareTo(t2) >= 0)); 
+0

Wenn ich Zeilen aus der Datenbanktabelle auswählen möchte, die eine Spalte mit currentTimeMIllis() Wert darin gespeichert haben. Wie kann ich obige Operation mit SQL-Abfrage durchführen? – aru007

+0

Sie erhalten einfach die 'long' Werte aus der Datenbank anstelle von' System.currentTimeMillis'. Außerdem müssen Sie 'ZoneId.systemDefault()' möglicherweise anpassen, um eine andere Zeitzone zu verwenden, z. wenn Sie sich auf 'EDT (UTC-4: 00)' beziehen, aber den Code in Europa ausführen ... – fabian

+0

Einfacher zu verwenden 'Instant.ofEpochMilli'. Und wenn Sie eine Zeitzone zuweisen, verwenden Sie 'ZonedDateTime'. Der Zweck von 'LocalDateTime' ist es, Zeitzoneninformationen * zu verlieren *. –

0

Hier ist ein Beispielprogramm, das Ihnen helfen könnte. Der springende Punkt ist hier die Methode "findIfDatesWithinThreeHours", die hilft herauszufinden, ob zwei Instanzen im Abstand von drei Stunden liegen.

package com.inrvu.adapter; 

import java.util.Calendar; 
import java.util.Date; 


public class Tester { 

public static void main(String[] args) { 
    Date[] dates = getTwoDatesThreeHoursApart(); 
    System.out.println(String.format("%b", findIfDatesWithinThreeHours(dates[0],dates[1]))); 

    dates = getTwoDatesWithinThreeHours(); 
    System.out.println(String.format("%b", findIfDatesWithinThreeHours(dates[0],dates[1]))); 
} 

public static Date[] getTwoDatesThreeHoursApart() 
{ 
    Calendar calendar = Calendar.getInstance(); 
    Date date1 = calendar.getTime(); 
    calendar.add(Calendar.HOUR,4); 
    Date date2 = calendar.getTime(); 
    return new Date[]{date1,date2}; 
} 

public static Date[] getTwoDatesWithinThreeHours() 
{ 
    Calendar calendar = Calendar.getInstance(); 
    Date date1 = calendar.getTime(); 
    calendar.add(Calendar.HOUR,3); 
    Date date2 = calendar.getTime(); 
    return new Date[]{date1,date2}; 
} 

public static boolean findIfDatesWithinThreeHours(Date date1, Date date2) { 
    // here the time of a single hour is defined as 60*60*1000 
    System.out.println(date1); 
    System.out.println(date2); 
    return Math.abs(date1.getTime()-date2.getTime()) <= 3*60*60*1000; 

} 
} 
0

Ihre Frage ist vage. Dies könnte Sie in die richtige Richtung weisen.

Wenn Sie mit "Zeitstempel" eine Anzahl von Millisekunden seit der Epoche von 1970 UTC, construct an Instant gemeint. Diese Klasse repräsentiert einen Moment auf der Timeline in UTC mit einer Auflösung von Nanosekunden (feiner als Millisekunden).

Instant instant = Instant.ofEpochMilli(millis); 

Holen Sie sich den aktuellen Moment.

Instant now = Instant.now(); 

Berechnen Sie drei Stunden.

Instant in3Hours = now.plus(3 , ChronoUnit.HOURS); 

Sehen Sie, ob Ihr Moment zwischen jetzt und drei Stunden später liegt.

Boolean contained = ((! instant.isBefore(now)) && instant.isBefore(in3Hours)); 

Wenn Sie gemeint, Sie zu sehen ein Paar Momente vergleichen wollen, wenn die verstrichene Zeit weniger als 3 Stunden, eine Duration verwenden. Diese Klasse repräsentiert eine Zeitspanne in Sekunden und Nanosekunden.

Instant earlierInstant = … ; 
Instant laterInstant = … ; 
Duration duration = Duration.between(earlierInstant , laterInstant); 
if (duration.isNegative()) { 
    … handle error of unexpected data inputs where the second instant is *before* the first instant. 
} 
… else … 
Boolean elapsedUnderThreeHours = (duration.compareTo(Duration.ofHours(3)) == -1);