2013-10-29 5 views
16

Dies ist, was ich im Momentwie Millisekunden zu zeigen, in Tagen: Stunden: min: Sekunden

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

, die ich fühle mich richtig haben ist. für Stunden und Tage sollte es sein -

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

und dann-

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

aber meine Stunden und Tage kommen aus falsch ist

+0

also warum nutzen Sie nicht (native) date time classes ?! –

+1

Warum "% 24" an Tagen? Gibt es 24 Tage in einem Monat? –

+0

@ user2511414: Sie verwechseln natives und Framework. Nativ bedeutet, dass es in der Muttersprache des Betriebssystems geschrieben ist, was auch immer das ist (in diesem Fall C/C++), und es kann zum Framework oder zu jeder App gehören. Die Klassen, auf die Sie sich beziehen (z. B. SimpleDateFormat), gehören zum Framework, aber ob sie nativ sind oder nicht, ist nicht relevant. – njzk2

Antwort

28

Ein einfacher Weg, um die Zeit zu berechnen, ist dies etwas zu verwenden, wie

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; 

wird funktionieren, wenn Sie mehr als 28 Tage, aber nicht wenn du eine negative Zeit hast.

+0

funktioniert das, wenn Sie weniger als 28 Tage, aber mehr als 0 Tage haben? –

+0

@AkshatAgarwal es funktioniert für jede nicht negative Anzahl von Tagen. 0+ Die Verwendung von SimpleDateFormat funktioniert möglicherweise länger als 30 Tage nicht. –

+0

genau! Ich hatte Probleme mit SimpleDateFormat für eine Reihe von Daten wie weniger als 1 Tag (5 Stunden 5 Minuten 27 Sekunden usw.). Ich werde deine Idee versuchen, es sieht ungefähr richtig aus. –

7

Simple dein Freund sein! (Ich habe gerade entdeckt heute, es ist genial.)

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

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

+1 Können Sie erklären, warum 'Locale.UK' benötigt wird? Ich habe es nie benutzt. –

+1

BEARBEITEN: njzk2 ist korrekt - das wird für Zeitspannen weniger als einen Monat funktionieren. Dies funktioniert nicht * für Zeitspannen von mehr als einem Monat *. Ein SimpleDateFormat formatiert Kalenderdaten, nicht verstrichene Zeit. Es wird einen Millisekunden-Offset als ein Datum im ersten Monat von 1970 interpretieren. –

+1

@CharlesForsythe: Tatsächlich würde es für Zeiträume von weniger als einem Monat funktionieren. (Geben Sie keine Jahre oder Monate in Ihr Format ein). – njzk2

1

Sie können auch den joda Zeit-API (http://joda.org/joda-time/)

„Die Klasse Datetimeformat bietet eine einheitliche Methode forPattern (String), die Formatierung von Mustern unterstützt. Dieser‚Pattern-basierten‘Formatierer einen ähnlichen Ansatz bieten zu das von SimpleDateFormat. "

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

Sorry ich möchte nicht eine 4,1 MB-Bibliothek für eine Aufgabe so klein wie meine –

2

zu formatieren verstrichene/verbleibende Zeit in Android verwenden android.text.format.DateUtils, insbesondere getRelativeTimeSpanString und formatElapsedTime.

+0

können Sie erklären, was jeder von ihnen tun? –

+0

Die Dokumentation ist ziemlich vollständig, und ich sehe nicht, was ich hinzufügen könnte, die in keinem Tutorial über diese Klasse bereits sein würde. – njzk2

+0

Dies wird entweder ein "in" Präfix oder "vor" Suffix hinzufügen, und es zeigt nicht alle Tage, Stunden, Minuten, Sekunden, aber nur eine von ihnen abhängig von den Flags. – sschuberth

0

Hallo, wie wäre es mit diesem Code?

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(); 
    } 
} 
Verwandte Themen