2013-10-29 15 views
16

Questo è ciò che ho in questo momentocome mostrare millisecondi in giorni: ore: min: secondi

Seconds = (60 - timeInMilliSeconds/1000 % 60); 
Minutes = (60 - ((timeInMilliSeconds/1000)/60) %60); 

che mi pare corretto. per ore e giorni dovrebbe essere come -

Hours = ((((timeInMilliSeconds/1000)/60)/60) % 24); 
Days = ((((timeInMilliSeconds/1000)/60)/60)/24) % 24; 

e l'allora

TextView.SetText("Time left:" + Days + ":" + Hours + ":" + Minutes + ":" + Seconds); 

ma i miei orari e giorni stanno venendo fuori per non essere corretto

+0

quindi perché non utilizzare esistere (nativo) le classi di tempo ?! –

+1

Perché '% 24' in giorni? Ci sono 24 giorni al mese? –

+0

@ user2511414: stai confondendo nativo e framework. mezzi nativi scritti nel linguaggio nativo di os, qualunque cosa sia (in questo caso C/C++), e può appartenere al framework o ad ogni app. Le classi a cui ti riferisci (come SimpleDateFormat) appartengono al framework, ma se sono native o no non sono rilevanti. – njzk2

risposta

28

Un modo semplice per calcolare il tempo è quello di utilizzare qualcosa come

long seconds = timeInMilliSeconds/1000; 
long minutes = seconds/60; 
long hours = minutes/60; 
long days = hours/24; 
String time = days + ":" + hours % 24 + ":" + minutes % 60 + ":" + seconds % 60; 

Questo funziona se si dispone di più di 28 giorni, ma non se hai un tempo negativo.

+0

funzionerà se hai meno di 28 giorni ma più di 0? –

+0

@AkshatAgarwal funzionerà per qualsiasi numero di giorni non negativo. 0+ L'utilizzo di SimpleDateFormat potrebbe non funzionare per più di 30 giorni. –

+0

esattamente! Ho avuto problemi con SimpleDateFormat per un numero di date come meno di 1 giorno (5 ore 5 min 27 secondi ecc.). Darò una tua idea, sembra giusta. –

7

SimpleDateFormat è tuo amico! (Ho appena scoperto oggi, è impressionante.)

SimpleDateFormat formatter = new SimpleDateFormat("dd:HH:mm:ss", Locale.UK); 

Date date = new Date(timeInMilliSeconds); 
String result = formatter.format(date); 
+1

+1 Puoi spiegare perché ', Locale.UK' è necessario? Non l'ho mai usato. –

+1

MODIFICA: njzk2 è corretto - questo funzionerà per tempi inferiori a un mese. Questo non funzionerà * per tempi più lunghi di un mese *. Un formato SimpleDate Formatta le date del calendario, non il tempo trascorso. Interpreterà un offset millisecondo come data nel primo mese del 1970. –

+1

@CharlesForsythe: in effetti, per periodi inferiori a un mese, funzionerebbe. (solo non includere anni o mesi nel tuo formato). – njzk2

1

È inoltre possibile utilizzare l'API Joda-tempo (http://joda.org/joda-time/)

"Il DateTimeFormat classe fornisce un unico metodo forPattern (String) che supporta la formattazione dal modello. Questi '' formattatori del modello a base forniscono un approccio simile a quello di SimpleDateFormat. "

LocalDate date = LocalDate.now(); 
DateTimeFormatter fmt = DateTimeFormat.forPattern("d MMMM, yyyy"); 
String str = date.toString(fmt); 
+2

Scusa se non voglio incorporare una libreria da 4,1 MB per un'attività piccola come la mia –

2

per formattare trascorso/tempo rimanente in Android, utilizzare android.text.format.DateUtils, in particolare, getRelativeTimeSpanString e formatElapsedTime.

+0

puoi spiegare un po 'cosa fanno ciascuno di questi? –

+0

la documentazione è abbastanza completa, e non vedo cosa potrei aggiungere che non sarebbe già in alcun tutorial su questa classe. – njzk2

+0

Questo aggiungerà un prefisso "in" o "fa" e non visualizzerà tutti i giorni, ore, minuti, secondi, ma solo uno di essi dipende dai flag. – sschuberth

0

Ciao, che ne dici di questo codice?

example) 

       0 ms -> 0 ms 
      846 ms -> 846ms 
      1,000 ms -> 1s 
      1,034 ms -> 1s 34ms 
     60,000 ms -> 1m 
     94,039 ms -> 1m 34s 39ms 
     3,600,000 ms -> 1h 
    61,294,039 ms -> 17h 1m 34s 39ms 
    86,400,000 ms -> 1d 
    406,894,039 ms -> 4d 17h 1m 34s 39ms 
31,536,000,000 ms -> 1y 
50,428,677,591 ms -> 1y 218d 15h 57m 57s 591ms 



/** 
* 
* @since 2018. 1. 9. 
* @author Park_Jun_Hong_(fafanmama_at_naver_com) 
*/ 
public class TimeUtils { 

    /** 
    * 
    * @since 2018. 1. 9. 
    */ 
    private TimeUtils() { 
    } 

    private static void appendTimeAndUnit(StringBuffer timeBuf, long time, String unit) { 
     if (time < 1) { 
      return; 
     } 

     timeBuf.append(time); 
     timeBuf.append(unit); 
    } 

    private static void prependTimeAndUnit(StringBuffer timeBuf, long time, String unit) { 
     if (time < 1) { 
      return; 
     } 

     if (timeBuf.length() > 0) { 
      timeBuf.insert(0, " "); 
     } 

     timeBuf.insert(0, unit); 
     timeBuf.insert(0, time); 
    } 

    /** 
    * Provide the Millisecond time value in {year}y {day}d {hour}h {minute}m {second}s {millisecond}ms. <br> 
    * Omitted if there is no value for that unit. 
    * 
    * @param timeInMillis 
    * @return 
    * 
    * @since 2018. 1. 9. 
    */ 
    public static String toYYYYHHmmssS(long timeInMillis) { 

     if (timeInMillis < 1) { 
      return "0 ms"; 
     } 

     StringBuffer timeBuf = new StringBuffer(); 

     long millis = timeInMillis % 1000; 
     appendTimeAndUnit(timeBuf, millis, "ms"); 

     // second (1000ms) & above 
     long time = timeInMillis/1000; 
     if (time < 1) { 
      return timeBuf.toString(); 
     } 

     long seconds = time % 60; 
     prependTimeAndUnit(timeBuf, seconds, "s"); 

     // minute(60s) & above 
     time = time/60; 
     if (time < 1) { 
      return timeBuf.toString(); 
     } 

     long minutes = time % 60; 
     prependTimeAndUnit(timeBuf, minutes, "m"); 

     // hour(60m) & above 
     time = time/60; 
     if (time < 1) { 
      return timeBuf.toString(); 
     } 

     long hours = time % 24; 
     prependTimeAndUnit(timeBuf, hours, "h"); 

     // day(24h) & above 
     time = time/24; 
     if (time < 1) { 
      return timeBuf.toString(); 
     } 

     long day = time % 365; 
     prependTimeAndUnit(timeBuf, day, "d"); 

     // year(365d) ... 
     time = time/365; 
     if (time < 1) { 
      return timeBuf.toString(); 
     } 

     prependTimeAndUnit(timeBuf, time, "y"); 

     return timeBuf.toString(); 
    } 
} 
Problemi correlati