2009-02-21 20 views

Respuesta

41

En este caso, solo necesita dividir.

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; 

Para los cálculos de fechas más sofisticados, tales como el número de días dentro de los diez millones de segundos después de 15:00 el 19 de enero de 1983, se utiliza la clase NSCalendar junto con NSDateComponents. La guía de programación de fecha y hora de Apple lo ayuda aquí.

+0

Gracias. Sin embargo, esperaba que hubiera algún método integrado. – higginbotham

+0

@higginbotham - Deberías marcar esta respuesta como correcta si te ayudó. – Moshe

32

probar esto,

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

y se puede utilizar para obtener más detalles como días, semanas, meses y años siguiendo el mismo procedimiento

+2

Esta es la manera más limpia y concisa. –

+0

Buen método.si los segundos no son un tipo entero, entonces no podemos hacer operaciones como ** remainder = seconds% 3600 **. – Gangadhar

+0

La pregunta realmente mencionada es un número entero. –

3

Uso de la función strftime incorporado() :

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

La forma más preferida en objetivo-c podría ser esta, como recomienda Apple en su documento.

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); 

Asegúrese de no recuperar los componentes no definidas con los unitFlags, número entero será "indefinido".

+0

no se romperá si el cálculo se realiza de manera que DTS o lo que sea se encuentre entre 'startDate' y' endDate'? –

7

Sé que esta es una publicación anterior, pero quería compartirla de todos modos. El siguiente código es lo que uso.

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

Primera línea - Obtenemos el resto de segundos al dividir por el número de segundos en minutos.

Segunda línea - Obtenemos el resto de segundos después de dividir por el número de segundos en una hora. Luego dividimos eso por segundos en un minuto.

Tercera línea: obtenemos el resto de segundos después de dividir por el número de segundos en un día. Luego lo dividimos por el número de segundos en una hora.

Cuarta línea: obtenemos el resto del segundo después de dividir por el número de segundos en un mes. Luego lo dividimos por el número de segundos en un día. Podríamos sólo tiene que utilizar el siguiente para Days ...

int days = totalSeconds/86400; 

Pero si usamos la línea anterior y quería continuar y obtener meses acabaríamos con 1 mes y 30 días cuando queríamos conseguir apenas 1 mes.

Abre una zona de juegos en Xcode y pruébalo.

+2

esta es la mejor respuesta – 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

mostrar el código ... – Vela

2

Solo una modificación de bit para ambos compatibles con 32 bit & 64 bit. Con NSInteger, el sistema convertirá automáticamente a int o long basing en 32/64 bit.

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

De la misma manera se puede convertir en días, semanas, meses, años

-1

Trata de hacer lo siguiente:

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

obtendrá días, horas, minutos y segundos de Total segundos (self.secondsLeft)

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

Código ......

[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

Ésta es mi algoritmo para convertir segundos en segundos, minutos y horas (utilizando sólo la cantidad total de segundos y la relación entre cada uno de ellos):

int S = totalSeconds % BaseSMH 

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

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

Y aquí sigue mi explicación de la misma :

Ensayo tiempo de convertir en segundos: HH: MM: SS = 02:20:10 => totalseconds = 2 * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

La base de Entre segundos -> minutos y minutos -> horas es 60 (de segundos -> horas es 60^2 = 3600).

int totalSeconds = 8410 
const int BaseSMH = 60 

Cada unidad (en este caso representado por una variable) se puede calcular mediante la eliminación de la unidad anterior (expresado en segundos) de la cantidad total de segundos y se divide por la relación entre el segundo y la unidad que estamos tratando de calcular. Esto es lo que cada calulation parece que el uso de este algoritmo:

int S = totalSeconds % BaseSMH 

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

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

Al igual que con todas las matemáticas que ahora podemos sustituir cada unidad en los minutos y horas cálculos con cómo se calculó la unidad anterior y cada cálculo será el siguiente aspecto (recordar que dividir con BaseSMH en el cálculo de M y multiplicando por BaseSMH en el calulation H cancela el uno al otro):

int S = totalSeconds % BaseSMH 

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

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

pruebas con el "totalseconds" y "BaseSMH" desde arriba se verá así:

int S = 8410 % 60 

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

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

Cálculo S:

int S = 8410 % 60 = 10 

M Cálculo:

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

Cálculo H:

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 esto se puede añadir cualquier unidad que desee, sólo tiene que calcular lo que el la relación es entre segundos y la unidad que desea. Espero que entiendas mis explicaciones de cada paso. Si no, solo pregunta y puedo explicar más.

Cuestiones relacionadas