Timer – Come faccio a calcolare la differenza tra due date utilizzando Joda Tempo?

Voglio ottenere la differenza tra i due tempi P (ora di inizio) e Q (fine tempo) usando Joda Tempo. P e Q potrebbe essere volte in giorni diversi o addirittura il giorno stesso. Voglio ottenere la differenza in formato HH-MM-SS, dove H=ore, M=minuti, S=secondi.

Voglio utilizzare questa funzionalità in un timer. Presumo che nessuno potrà utilizzare il mio timer per misurare più di 24 ore.

Per favore mi guida per fare questo.

 

2 Replies
  1. 19

    Dare un’occhiata al Joda tempo FAQ
    http://joda-time.sourceforge.net/faq.html#datediff

    E si può usare un PeriodFormatter per ottenere il formato di vostra scelta. Prova il seguente codice di esempio.

    DateTime dt = new DateTime();
    DateTime twoHoursLater = dt.plusHours(2).plusMinutes(10).plusSeconds(5);
    Period period = new Period(dt, twoHoursLater);
    PeriodFormatter HHMMSSFormater = new PeriodFormatterBuilder()
            .printZeroAlways()
            .minimumPrintedDigits(2)
            .appendHours().appendSeparator("-")
            .appendMinutes().appendSeparator("-")
            .appendSeconds()
            .toFormatter(); //produce thread-safe formatter
    System.out.println(HHMMSSFormater.print(period));
    • Vedo che abbiamo per l’uso – org.joda.tempo.Periodo.Periodo(ReadableInstant startInstant, ReadableInstant endInstant) per l’esempio che hanno dato i tuoi link. Se sai già come questo deve essere fatto, mi puoi mostrare ?
    • Ho modificato la mia risposta per includere un codice di esempio. Provare.
    • Grazie ! L’uscita è – 2-10-5. come posso fare 02-10-05 ?
    • L’idea qui – stackoverflow.com/questions/275711/…
    • Utilizzare minimumPrintedDigits(2).
    • c’è un punto e virgola dopo appendSeconds() che è inutile e impedisce il codice da compilare. Non è possibile modificare a causa di modifiche devono essere di almeno 6 caratteri
    • Sembra una modifica alla mia originale risposta ha causato il problema. La sua dovrebbe essere risolto ora.

  2. 1

    Ammiro il Joda data/ora di API. Esso offre alcune interessanti funzionalità e se ho bisogno di un immutabile calendario o qualche esoterico calendario opzioni che offre, mi piacerebbe essere tutto su di esso.

    È ancora un esterno API però.

    Così … perchè usare quando non è necessario. Nel Joda API, “Istantanea” è la stessa cosa come un’API Java “Data” (o molto vicino ad esso). Questi sono entrambi sottile wrapper intorno a un lungo che rappresenta un istante in POSIX EPOCA UTC tempo (che è il numero di millisecondi trascorsi dall’00:00 del 1 gennaio 1970 UTC.

    Se si hanno due Istanti o due Date, il calcolo di giorni tra di loro è banale, e la Joda biblioteca non è assolutamente necessario per questo scopo:

    public double computeDaysBetweenDates(Date earlier, Date later) {
        long diff;
    
        diff = later.getTime() - earlier.getTime();
        return ((double) diff) / (86400.0 * 1000.0);
    }

    Questo presuppone che il numero di secondi in un giorno è 86400 … e questo è in gran parte vero.

    Una volta che si dispone di una differenza come un doppio, è banale per la conversione della parte frazionaria di risposta (che è la frazione di un giorno) in HH:MM:SS.

    • Ha a che fare con la leggibilità. La maggior parte delle persone non vedono 86400 e immediatamente pensare a un numero di secondi in un giorno. Inoltre, dato che java.util.La data è mutevole, può causare mal di testa e bug al punto che la gente preferisce andare a una API di terze parti. La risposta di cui sopra da @IceMan aveva solo circa 3 righe di codice per realizzare quello che era il volere e il resto era per la formattazione e il codice è molto più facile per chiunque di capire cosa l’intento era.
    • La leggibilità è importante, ma non vedo perché l’intento del metodo che ho fornito non dovrebbe essere oscuro. Per esempio, uno potrebbe includere private final double MILLIS_IN_A_DAY = 86400.0 * 1000.0 per effettuare il calcolo in riga finale più chiaro. E, se è vero che la Data è mutevole, al di sopra di routine è threadsafe … e questa routine può essere facilmente modificato per utilizzare longs direttamente. Il punto qui è che una semplice soluzione a questo problema è accessibile senza bisogno di Joda (non parla le implicazioni di Java Data/Ora di API).

Lascia un commento