2009-02-21 4 views

risposta

41

In questo caso, è sufficiente dividere.

days = num_seconds/(60 * 60 * 24); 
num_seconds -= days * (60 * 60 * 24); 
hours = num_seconds/(60 * 60); 
num_seconds -= hours * (60 * 60); 
minutes = num_seconds/60; 

Per ulteriori sofisticati calcoli di data, come ad esempio il numero di giorni entro i dieci milioni di secondi dopo 15:00 il 19 gennaio del 1983, si può usare la classe NSCalendar con NSDateComponents. La guida alla programmazione di data e ora di Apple ti aiuta qui.

+0

Grazie. Speravo che ci fosse qualche metodo integrato, comunque. – higginbotham

+0

@higginbotham - Dovresti contrassegnare questa risposta come corretta se ti ha aiutato. – Moshe

32

provare questo,

int forHours = seconds/3600, 
remainder = seconds % 3600, 
forMinutes = remainder/60, 
forSeconds = remainder % 60; 

e lo si può utilizzare per ottenere più dettagli come giorni, settimane, mesi e anni, seguendo la stessa procedura

+2

Questo è il modo più pulito e più conciso. –

+0

Buon metodo.se secondi non è un tipo intero, non possiamo eseguire operazioni come ** remainder = seconds% 3600 **. – Gangadhar

+0

La domanda in realtà menzionata è un numero intero. –

3

Utilizzare la funzione strftime built-in() :

static char timestr[80]; 
char * HHMMSS (time_t secs) 
{ 
    struct tm ts; 
    ts = *localtime(&secs); 
    strftime(timestr, sizeof(timestr), "%a %b %d %H:%M:%S %Y %Z", &ts); // "Mon May 1, 2012 hh:mm:ss zzz" 
    return timestr; 
} 
6

Il modo più preferito in Objective-C potrebbe essere questa, come consigliare da Apple nel loro doc.

NSDate *startDate = [NSDate date]; 
    NSDate *endDate = [NSDate dateWithTimeInterval:(365*24*60*60*3+24*60*60*129) sinceDate:startDate]; 

    NSCalendar *gregorian = [[NSCalendar alloc] 
          initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSDateComponents *components = [gregorian components:unitFlags 
               fromDate:startDate 
                toDate:endDate options:0]; 
    NSInteger years = [components year]; 
    NSInteger months = [components month]; 
    NSInteger days = [components day]; 
    NSLog(@"years = %ld months = %ld days = %ld",years,months,days); 

Assicurarsi di non recuperare i componenti non definiti con i unitFlags, integer sarà "indefinito".

+0

non si interromperà se il calcolo viene eseguito in modo tale che DTS o qualsiasi cosa cada tra 'startDate' e' endDate'? –

7

So che questo è un vecchio post ma volevo condividere comunque. Il seguente codice è quello che uso.

int seconds = (totalSeconds % 60); 
int minutes = (totalSeconds % 3600)/60; 
int hours = (totalSeconds % 86400)/3600; 
int days = (totalSeconds % (86400 * 30))/86400; 

Prima riga: otteniamo il resto dei secondi dividendo per numero di secondi in un minuto.

Seconda riga: otteniamo il resto dei secondi dopo la divisione per il numero di secondi in un'ora. Quindi lo dividiamo per secondi in un minuto.

Terza riga: otteniamo il resto dei secondi dopo la divisione per il numero di secondi in un giorno. Quindi lo dividiamo per il numero di secondi in un'ora.

Quarta riga: otteniamo il resto del secondo dopo aver diviso per il numero di secondi in un mese. Quindi lo dividiamo per il numero di secondi in un giorno. Potremmo utilizzare il seguente per la struttura Days ...

int days = totalSeconds/86400; 

Ma se abbiamo usato la linea precedente e volevamo proseguire ed ottenere mesi ci ritroveremmo con 1 mese e 30 giorni quando volevamo ottenere solo 1 mese.

Apri un parco giochi in Xcode e provalo.

+2

questa è la migliore risposta – Clint

0
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
    Date dateObj1=null; 
    Date dateObj2=null; 
    try { 
     // String format = "MM/dd/yyyy hh:mm:ss"; 
     dateObj1 = sdf.parse(Appconstant.One_One_time); 
     dateObj2 = sdf.parse(Appconstant.One_Two_time); 
     Log.e(TAG, "dateObj12" + dateObj1.toString() + "---" + dateObj2.toString()); 
     DecimalFormat crunchifyFormatter = new DecimalFormat("###,###"); 
     long diff = dateObj2.getTime() - dateObj1.getTime(); 
     /*int diffDays = (int) (diff/(24 * 60 * 60 * 1000)); 
     System.out.println("difference between days: " + diffDays); 
     int diffhours = (int) (diff/(60 * 60 * 1000)); 
     System.out.println("difference between hours: " 
       + crunchifyFormatter.format(diffhours)); 
     int diffmin = (int) (diff/(60 * 1000)); 
     System.out.println("difference between minutes: " 
       + crunchifyFormatter.format(diffmin));*/ 
     int diffsec = (int) (diff/(1000)); 
     System.out.println("difference between seconds:" 
       + crunchifyFormatter.format(diffsec)); 
+0

visualizza il codice .... – Vela

2

Solo una modifica bit sia compatibile con 32 bit & 64 bit. Utilizzando NSInteger il sistema verrà automaticamente convertito in int o long basando su 32/64 bit.

NSInteger seconds = 10000; 
NSInteger remainder = seconds % 3600; 
NSInteger hours = seconds/3600; 
NSInteger minutes = remainder/60; 
NSInteger forSeconds = remainder % 60; 

Allo stesso modo è possibile convertire in giorni, settimane, mesi, anni

-1

Prova a fare quanto segue:

x=int(input("enter a positive integer: ")) 
    sec = int(x % 60); 
    minu =int((x % 3600)/60); 
    ho =int((x % 86400)/3600); 
    days =int(x/(60 * 60 * 24)); 
    print(int(days),"days", ho,"hours", minu , "minutes" , sec ,"seconds") 
0

otterrete giorni, ore, minuti e secondi da totale secondi (self.secondsLeft)

days = self.secondsLeft/86400; 
hours = (self.secondsLeft %86400)/3600; 
minutes = (self.secondsLeft % 3600)/60; 
seconds = (self.secondsLeft %3600) % 60; 

Codice ......

[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES]; 

-(void) updateCountdown { 

    int days,hours,minutes,seconds; 
    self.secondsLeft--; 

    days = self.secondsLeft/86400; 
    hours = (self.secondsLeft %86400)/3600; 
    minutes = (self.secondsLeft % 3600)/60; 
    seconds = (self.secondsLeft %3600) % 60; 

    NSLog(@"Time Remaining =%@",[NSString stringWithFormat:@"%02d:%02d:%02d:%02d",days, hours, minutes,seconds]); 
} 
1

Questo è il mio algoritmo per la conversione di secondi per secondi, minuti e ore (utilizzando solo la quantità totale di secondi e la relazione tra ciascuno di essi):

int S = totalSeconds % BaseSMH 

int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2)/BaseSMH 

int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2))/BaseSMH^2 

E qui segue la mia spiegazione di esso :

test tempo convertito in secondi: HH: MM: SS = 02:20:10 => totalseconds = 3600 + 2 * 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

La base fra secondi -> minuti e minuti -> ore è 60 (da secondi -> ore è 60^2 = 3600).

int totalSeconds = 8410 
const int BaseSMH = 60 

Ogni unità (qui rappresentato da una variabile) può essere calcolato rimuovendo l'unità precedente (espresso in secondi) dalla quantità totale di secondi e dividerlo per il suo rapporto tra secondi e l'unità stiamo cercando di calcolare. Questo è ciò che ogni calulation assomiglia usando questo algoritmo:

int S = totalSeconds % BaseSMH 

int M = ((totalSeconds - S) % BaseSMH^2)/BaseSMH 

int H = (totalSeconds - S - M * BaseSMH)/BaseSMH^2 

Come per tutti la matematica ora possiamo sostituire ogni unità nei minuti e ore calcoli con quanto abbiamo calcolato l'unità precedente e ogni calcolo sarà quindi simile a questa (ricordare che divide con BaseSMH nel calcolo M e moltiplicando per BaseSMH nel calulation H annulla a vicenda):

int S = totalSeconds % BaseSMH 

int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2)/BaseSMH 

int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2))/BaseSMH^2 

test con le "totalseconds" e "BaseSMH" dall'alto sarà simile a questa:

int S = 8410 % 60 

int M = ((8410 - 8410 % 60) % 60^2)/60 

int H = (8410 - 8410 % 60 - ((8410 - 8410 % 60) % 60^2))/60^2 

Calcolo S:

int S = 8410 % 60 = 10 

M Calcolo:

int M = ((8410 - 8410 % 60) % 60^2)/60 
= ((8410 - 10) % 3600)/60 
= (8400 % 3600)/60 
= 1200/60 
= 20 

H Calcolo:

int H = (8410 - 8410 % 60 - ((8410 - 8410 % 60) % 60^2))/60^2 
= (8410 - 10 - ((8410 - 10) % 3600))/3600 
= (8400 - (8400 % 3600))/3600 
= (8400 - 1200)/3600 
= 7200/3600 
= 2 

Con questo è possibile aggiungere qualsiasi unità che si desidera, basta calcolare ciò che il la relazione è tra secondi e l'unità che vuoi. Spero che tu capisca le mie spiegazioni su ogni passaggio. In caso contrario, basta chiedere e posso spiegare ulteriormente.