2017-11-28 16 views
1

Zeitstempel werden in einer Datenbank gespeichert. Was ist eine Lösung, um zu bestimmen, ob ein Zeitstempel, der "b" genannt wird, der Tag nach einem anderen Zeitstempel ist, der "a" genannt wird?Bestimmen, ob ein Instant der Tag nach dem anderen ist Instant, Factoring in Zeitzone

Eine Zeitzone wird als Argument angegeben.

Betrachten wir zum Beispiel:

Instant a = Instant.ofEpochSecond(1511928000L); // 11/29/17 4 AM 
Instant b = Instant.ofEpochSecond(1511935200L); // 11/29/17 6 AM 

Wenn der Benutzer wissen möchte, ob b ist der Tag nach einer in der östlichen Zeitzone (-5 Stunden), wird das Programm vergleichen:

Sofort ein am 28.11.17 11 Uhr und Instant b am 29.11.17 1 Uhr morgens und bestimmen, dass b der Tag nach a ist.

+2

Erstellen Sie ZonedDateTim Dann vergleiche die Daten. – xs0

Antwort

3

eine Lösung gefunden:

public static void main(String[] args) { 
    Instant a = Instant.ofEpochSecond(1511928000L); // 11/29/17 4 AM 
    Instant b = Instant.ofEpochSecond(1511935200L); // 11/29/17 6 AM 
    ZoneId localZone = ZoneId.of("America/New_York"); // Can be any zone ID 

    if (isBOneDayAfterA(a, b, localZone)) { 
     System.out.println("b is one day after a!"); 
    } else { 
     System.out.println("b is NOT one day after a"); 
    } 
} 

public static boolean isBOneDayAfterA(Instant a, Instant b, ZoneId localZone) { 
    LocalDateTime aAdjusted = LocalDateTime.ofInstant(a, localZone); 
    LocalDateTime bAdjusted = LocalDateTime.ofInstant(b, localZone); 
    LocalDate aDate = aAdjusted.toLocalDate(); 
    LocalDate bDate = bAdjusted.toLocalDate(); 

    return bDate.minusDays(1).equals(aDate); 
} 
2

Die korrekte Zonen-ID kann mit ZoneId.getAvailableZoneIds() abgerufen werden. Das ist nützlich, um landesspezifisch zu sparen.

Neben ZonedDateTime auch ist folgendes möglich:

ZoneId zoneId = ZoneId.of("UTC-5h"); 
OffsetDateTime ad = OffsetDateTime.ofInstant(a, zoneId); 
OffsetDateTime bd = OffsetDateTime.ofInstant(b, zoneId); 
return ad.getDayOfYear() != bd.getDayOfYear(); 

Nach Kommentar eine bessere Lösung - für den gleichen Tag des Jahres in verschiedenen Jahren:

ZoneId zoneId = ZoneId.of("UTC-5h"); 
ZonedDateTime ad = ZonedDateTime.ofInstant(a, zoneId).truncatedTo(ChronoUnit.DAYS); 
ZonedDateTime bd = ZonedDateTime.ofInstant(b, zoneId).truncatedTo(ChronoUnit.DAYS); 
return !ad.equals(bd); 
+1

Vergleichen Sie einfach den Tag des Jahres ist fragil, wenn Sie vielleicht vergleichen, sagen, 28. November letzten Jahres mit 28. November dieses Jahres. –

+2

@ OleV.V. Die Frage war Tagesgrenzen, aber Sie haben Recht; erweiterte die Antwort, aber die eigene Antwort des OP, einfach LocalDate + ZoneId scheint passender. Ich gestehe, dass ich LocalDate hier nicht vertraut habe. –