2011-11-13 17 views
7

Sto cercando di ottenere un valore doppio con secondi per la conversione in formato orario personalizzato. Ho provato SimpleDate Format ma non funziona ...Tempo in secondi per il formato stringa personalizzato

Ho un doppio valore in questo formato: 407.33386569554585 (che rappresenta 407 secondi e 333 millisecondi ...).

Ho bisogno che in questo formato: HH/MM/SS.MS

Come dovrei farlo?

Grazie in anticipo!

+0

Come si fa il valore entrare in quella doppia variabile? E come viene costruito il doppio valore? Non riesco a vedere nessun secondo là :) – saintedlama

+0

D'accordo, cosa rappresenta quel doppio? – Lucas

+0

Qui puoi trovare alcune idee: http://stackoverflow.com/questions/266825/how-to-format-a-duration-in-java-eg-format-hmmss –

risposta

12

Moltiplicare per 1.000, quindi trasmettere a long e costruire una data con esso.

Date date = new Date((long)(dubTime*1000)); 

Da qui, è possibile utilizzare un SimpleDateFormat per rendere la stringa vuoi.

String formattedDate = new SimpleDateFormat("HH/mm/ss.SSS").format(date); 
+2

Continua ad aggiungere 9 ore e 30 minuti su .... stranamente questo è il mio fuso orario +9: 30 ... – Diesal11

+0

Come lo rimuovo? – Diesal11

+0

Sembra che tu voglia impostare il 'Locale' di' Date' o cambiare il 'Locale' dopo la costruzione. Non sono sicuro. Fondamentalmente, il 'long' che stai passando sarà interpretato come i millisecondi trascorsi dal 1 gennaio 1970 GMT. Se il valore 'double' per il tempo che hai non è un conteggio di secondi da quell'epoca, dovrai eseguire ulteriori trasformazioni per renderlo tale. –

2

Ecco un po 'di codice che è possibile adattare facilmente. L'implementazione di sotto stamperà un valore come 00days 00h00m00s00ms:

public final static long ONE_MILLISECOND = 1; 
public final static long MILLISECONDS_IN_A_SECOND = 1000; 

public final static long ONE_SECOND = 1000; 
public final static long SECONDS_IN_A_MINUTE = 60; 

public final static long ONE_MINUTE = ONE_SECOND * 60; 
public final static long MINUTES_IN_AN_HOUR = 60; 

public final static long ONE_HOUR = ONE_MINUTE * 60; 
public final static long HOURS_IN_A_DAY = 24; 
public final static long ONE_DAY = ONE_HOUR * 24; 
public final static long DAYS_IN_A_YEAR = 365; 

public String formatHMSM(Number n) { 


    String res = ""; 
    if (n != null) { 
     long duration = n.longValue(); 

     duration /= ONE_MILLISECOND; 
     int milliseconds = (int) (duration % MILLISECONDS_IN_A_SECOND); 
     duration /= ONE_SECOND; 
     int seconds = (int) (duration % SECONDS_IN_A_MINUTE); 
     duration /= SECONDS_IN_A_MINUTE; 
     int minutes = (int) (duration % MINUTES_IN_AN_HOUR); 
     duration /= MINUTES_IN_AN_HOUR; 
     int hours = (int) (duration % HOURS_IN_A_DAY); 
     duration /= HOURS_IN_A_DAY; 
     int days = (int) (duration % DAYS_IN_A_YEAR); 
     duration /= DAYS_IN_A_YEAR; 
     int years = (int) (duration); 
     if (days == 0) { 
      res = String.format("%02dh%02dm%02ds%03dms", hours, minutes, seconds, milliseconds); 
     } else if (years == 0) { 
      res = String.format("%ddays %02dh%02dm%02ds%03dms", days, hours, minutes, seconds, milliseconds); 
     } else { 
      res = String.format("%dyrs %ddays %02dh%02dm%02ds", years, days, hours, minutes, seconds); 
     } 
    } 
    return res; 

} 
1

Giusto per aggiungere alla risposta di Tim: per ottenere una corretta stringa indipendentemente dal vostro fuso orario, basta usare SimpleDateFormat.setTimeZone():

DateFormat dateFormat = new SimpleDateFormat("HH/mm/ss.SSS"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
// ... 
double doubleTime=1000.0; 
Date date = new Date((long) (doubleTime*1000)); 
String formattedTime = dateFormat.format(date); 

ed essere sicuri di consultare DateFormat.setTimeZone javadoc per sapere quando timeZone potrebbe essere sovrascritto.

3

E in Java 8 stile (se si vuole evitare l'avvertimento deprecazione Data):

DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("HH/mm/ss.SSS").withZone(ZoneId.of("UTC")); 
Instant instant = Instant.ofEpochMilli((long)(dubTime*1000)); 
return formatter.format(instant); 
+0

Data non ancora deprecata. – assylias

+0

Sì, il resoconto della morte di Date era esagerato. :-) –

Problemi correlati