2011-11-13 16 views
7

Próbuję uzyskać podwójną wartość z sekundami, aby przekonwertować na niestandardowy format czasu. Wypróbowałem SimpleDate Format, ale to nie działa ...Czas w sekundach do niestandardowego formatu ciągu znaków

Mam podwójną wartość w tym formacie: 407.33386569554585 (reprezentujący 407 sekund i 333 milisekund ...).

muszę, że w tym formacie: HH/MM/SS.MS

Jak to zrobić?

Z góry dziękuję!

+0

W jaki sposób uzyskać wartość tej zmiennej w podwójnej? A jak zbudowana jest podwójna wartość - nie widzę już żadnej sekundy :) – saintedlama

+0

Uzgodnione, co to podwójnie reprezentuje? – Lucas

+0

Możesz uzyskać kilka pomysłów tutaj: http://stackoverflow.com/questions/266825/how-to-format-a-duration-in-java-eg-format-hmmss –

Odpowiedz

12

Pomnożyć przez 1,000, a następnie przesłać do long i skonstruować z nim datę.

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

Z tego miejsca można użyć SimpleDateFormat, aby utworzyć ciąg znaków.

+2

Ciągle dodaje 9 godzin i 30 minut .... na tyle zabawnie, że moja strefa czasowa +9: 30 ... – Diesal11

+0

Jak mogę ją usunąć? – Diesal11

+0

Wygląda na to, że możesz chcieć ustawić 'Locale'' 'Date' lub zmienić' Locale' po skonstruowaniu. Niepewny. Zasadniczo "długi", który przechodzisz, będzie interpretowany jako milisekundy, które minęły od 1 stycznia 1970 GMT. Jeśli wartość 'double' dla twojego czasu nie jest liczbą sekund od tej epoki, musisz wykonać dodatkowe transformacje, aby tak się stało. –

2

Oto fragment używanego przez nas kodu, który można łatwo dostosować. Realizacja poniżej wypisze wartość jako 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

Wystarczy dodać do odpowiedzi Tima: aby otrzymać właściwy ciąg niezależnie od strefy czasowej, wystarczy użyć 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); 

I należy skonsultować DateFormat.setTimeZone javadoc, aby wiedzieć, kiedy timeZone może zostać nadpisany.

3

I w Java 8 stylu (jeśli chcesz uniknąć ostrzeżenia Deprecation 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 nie jest przestarzała (jeszcze). – assylias

+0

Tak, raport o śmierci Daktyla był przesadą. :-) –

Powiązane problemy