Converti il ​​timestamp in millisecondi in tempo formattato in stringa in Java


126

Sto cercando di convertire un valore lungo ( numero di millisecondi trascorsi dall'1 / 1/1970, ad esempio Epoch ) al tempo del formato h:m:s:ms.

Il lungo valore che utilizzo come data / ora, ricavo dal campo timestampdi un evento di registrazione da log4j.

Finora ho provato quanto segue e fallisce:

logEvent.timeStamp/ (1000*60*60)
TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

ma ottengo un valore errato:

1289375173771 for logEvent.timeStamp
358159  for logEvent.timeStamp/ (1000*60*60) 
21489586 for TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

Come posso procedere?

Risposte:


188

Prova questo:

Date date = new Date(logEvent.timeSTamp);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateFormatted = formatter.format(date);

Vedere SimpleDateFormat per una descrizione di altre stringhe di formato accettate dalla classe.

Vedi l' esempio eseguibile usando input di 1200 ms.


8
Commento: HH stamperà l'ora a quella data (0-23), non la quantità totale di ore trascorse dal 1970. Basta dire.
JohnyTex,

4
E non dimenticare. Il vecchio SimpleDateFormat non può essere utilizzato in multithread.
keiki

per importare SimpleDateFormat, utilizzare l'importazione come segue:import java.text.*;
Naveen Kumar RB

1
Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle . Vedi: stackoverflow.com/a/4142428/642706
Basil Bourque

1
qual è il tipo di logevent? Puoi per favore inserire la domanda?
Raulp,

127
long millis = durationInMillis % 1000;
long second = (durationInMillis / 1000) % 60;
long minute = (durationInMillis / (1000 * 60)) % 60;
long hour = (durationInMillis / (1000 * 60 * 60)) % 24;

String time = String.format("%02d:%02d:%02d.%d", hour, minute, second, millis);

13
Mi piace la tua soluzione meglio della risposta accettata in quanto è un po 'più esplicita e non presenta problemi con le impostazioni locali. Anche se ti manca la parte finale: millis = millis% 1000, che giustamente metterebbe i millisecondi alla fine della stringa formattata.
Ondrej Burkert,

7
@WesleyDeKeirsmaeker, in generale, la leggibilità è più importante della concisione.
Alphaaa,

2
perché resto con 24 per ore?
baboo,

2
La divisione non è associativa: 50000 / (1000 * 60) = 0.8333333333 mentre 50000/1000 * 60 = 3000.
farnett,

3
'millis = millis% 1000' mancante: D \ n e se hai bisogno di giorni, qui vai: 'long days = (millis / (1000 * 60 * 60 * 24));'
Adreamus,

38

Ti mostrerò tre modi per (a) ottenere il campo dei minuti da un valore lungo e (b) stamparlo usando il formato Data desiderato. Uno utilizza java.util.Calendar , un altro utilizza Joda-Time e l'ultimo utilizza il framework java.time incorporato in Java 8 e versioni successive.

Il framework java.time soppianta le vecchie classi date-time in bundle ed è ispirato a Joda-Time, definito da JSR 310, e ampliato dal progetto ThreeTen-Extra.

Il framework java.time è la strada da percorrere quando si utilizza Java 8 e versioni successive. Altrimenti, come Android, usa Joda-Time. Le classi java.util.Date/.Calendar sono notoriamente problematiche e dovrebbero essere evitate.

java.util.Date & .Calendar

final long timestamp = new Date().getTime();

// with java.util.Date/Calendar api
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
// here's how to get the minutes
final int minutes = cal.get(Calendar.MINUTE);
// and here's how to get the String representation
final String timeString =
    new SimpleDateFormat("HH:mm:ss:SSS").format(cal.getTime());
System.out.println(minutes);
System.out.println(timeString);

Joda-Time

// with JodaTime 2.4
final DateTime dt = new DateTime(timestamp);
// here's how to get the minutes
final int minutes2 = dt.getMinuteOfHour();
// and here's how to get the String representation
final String timeString2 = dt.toString("HH:mm:ss:SSS");
System.out.println(minutes2);
System.out.println(timeString2);

Produzione:

24
09: 24: 10: 254
24
09: 24: 10: 254

java.time

long millisecondsSinceEpoch = 1289375173771L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , ZoneOffset.UTC );

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "HH:mm:ss:SSS" );
String output = formatter.format ( zdt );

System.out.println ( "millisecondsSinceEpoch: " + millisecondsSinceEpoch + " instant: " + instant + " output: " + output );

millisecondi Dall'inizio: 1289375173771 istantaneo: 2010-11-10T07: 46: 13.771Z uscita: 07: 46: 13: 771


1
C'è qualche motivo di prestazione o qualsiasi altro motivo, dovrei preferire Joda su Calendar?
Cratylus,

1
in casi semplici come questo, no. In generale: l'API di Joda è progettata meglio. ad es. le date java sono mutabili, le date Joda no. Joda è anche più facile da programmare, puoi accedere a quasi tutte le funzionalità della classe DateTime senza dover convertire avanti e indietro tra Data e Calendario
Sean Patrick Floyd,

ha delle dipendenze che dovrei essere a conoscenza?
Cratylus,

2
Buona risposta, ma suggerisco anche di specificare il fuso orario piuttosto che fare affidamento implicito sul fuso orario predefinito corrente della JVM. Quindi la chiamata al costruttore di DateTime avrebbe un secondo argomento, un DateTimeZoneoggetto. In questo modo:new DateTime( timestamp, DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque,

2
@Cratylus Le classi java.time soppiantano sia Joda-Time sia le vecchie classi data-ora legacy in bundle con Java. Joda-Time ha ispirato le lezioni di java.time, entrambi i progetti guidati dallo stesso uomo, Stephen Colbourne.
Basil Bourque,

22

È possibile usare i commons apache (commons-lang3) e la sua classe DurationFormatUtils.

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.1</version>
</dependency>

Per esempio:

String formattedDuration = DurationFormatUtils.formatDurationHMS(12313152);
// formattedDuration value is "3:25:13.152"
String otherFormattedDuration = DurationFormatUtils.formatDuration(12313152, DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN);
// otherFormattedDuration value is "P0000Y0M0DT3H25M13.152S"

Spero che possa aiutare ...


8
long second = TimeUnit.MILLISECONDS.toSeconds(millis);
long minute = TimeUnit.MILLISECONDS.toMinutes(millis);
long hour = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.SECONDS.toMillis(second);
return String.format("%02d:%02d:%02d:%d", hour, minute, second, millis);

2
Questo non sembra corretto. Ad TimeUnit.MILLISECONDS.toSeconds()esempio, converte i millisecondi alla stessa durata in secondi o i secondi rimanenti dopo aver sottratto ore e minuti? La soluzione richiede quest'ultima.
Derek Mahar,

Questo metodo non è corretto, restituisce 431220: 25873204: 1552392282: 0 se voglio convertire la data del 12 marzo 2019 alle 13h04 42s
0ddlyoko

6
public static String timeDifference(long timeDifference1) {
long timeDifference = timeDifference1/1000;
int h = (int) (timeDifference / (3600));
int m = (int) ((timeDifference - (h * 3600)) / 60);
int s = (int) (timeDifference - (h * 3600) - m * 60);

return String.format("%02d:%02d:%02d", h,m,s);

4

fare

logEvent.timeStamp / (1000*60*60)

ti darà ore, non minuti. Provare:

logEvent.timeStamp / (1000*60)

e finirai con la stessa risposta di

TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

Ma TimeUnit.MILLISECONDS.toMinutes (logEvent.timeStamp) dà anche la mia spazzatura. 21489586 non è minuti!
Cratylus,

1
È il numero di minuti trascorsi dal 01/01/1970.
Nico Huysamen,

Ok, quindi come posso ottenere il formato desiderato? Vale a dire 10: 50: 40: 450? Non so come usare il numero di minuti dal 1970.
Cratylus

Oh scusa, pensavo solo che volessi sapere come dargli un senso. Vedi il post di seanizer, che dovrebbe coprirlo.
Nico Huysamen,

3

Prova questo:

    String sMillis = "10997195233";
    double dMillis = 0;

    int days = 0;
    int hours = 0;
    int minutes = 0;
    int seconds = 0;
    int millis = 0;

    String sTime;

    try {
        dMillis = Double.parseDouble(sMillis);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }


    seconds = (int)(dMillis / 1000) % 60;
    millis = (int)(dMillis % 1000);

    if (seconds > 0) {
        minutes = (int)(dMillis / 1000 / 60) % 60;
        if (minutes > 0) {
            hours = (int)(dMillis / 1000 / 60 / 60) % 24;
            if (hours > 0) {
                days = (int)(dMillis / 1000 / 60 / 60 / 24);
                if (days > 0) {
                    sTime = days + " days " + hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                } else {
                    sTime = hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                }
            } else {
                sTime = minutes + " min " + seconds + " sec " + millis + " millisec";
            }
        } else {
            sTime = seconds + " sec " + millis + " millisec";
        }
    } else {
        sTime = dMillis + " millisec";
    }

    System.out.println("time: " + sTime);

0
    long hours = TimeUnit.MILLISECONDS.toHours(timeInMilliseconds);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours));
    long seconds = TimeUnit.MILLISECONDS
            .toSeconds(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes));
    long milliseconds = timeInMilliseconds - TimeUnit.HOURS.toMillis(hours)
            - TimeUnit.MINUTES.toMillis(minutes) - TimeUnit.SECONDS.toMillis(seconds);
    return String.format("%02d:%02d:%02d:%d", hours, minutes, seconds, milliseconds);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.