web-dev-qa-db-fra.com

Conversion secondes en jours, minutes et heures dans Obj-c

Dans objectif-c, comment puis-je convertir un entier (représentant les secondes) en jours, minutes, heures? 

Merci!

21
higginbotham

Dans ce cas, il vous suffit de diviser.

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;

Pour des calculs de date plus sophistiqués, tels que le nombre de jours dans les dix millions de secondes après 15 heures le 19 janvier 1983, vous utiliseriez la classe NSCalendar avec NSDateComponents. Le guide de programmation de la date et de l'heure d'Apple vous aide ici.

43
fish

essaye ça,

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

et vous pouvez l'utiliser pour obtenir plus de détails en jours, semaines, mois et années en suivant la même procédure

33
Amr Faisal

Je sais que c'est un ancien post, mais je voulais quand même partager. Le code suivant est ce que j'utilise.

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

Première ligne - Nous obtenons le reste des secondes en divisant par le nombre de secondes en quelques minutes.

Deuxième ligne - Nous obtenons le reste des secondes après avoir divisé par le nombre de secondes d'une heure. Ensuite, nous divisons cela par secondes en une minute.

Troisième ligne - Nous obtenons le reste des secondes après avoir divisé par le nombre de secondes d'un jour. Ensuite, nous divisons cela par le nombre de secondes dans une heure.

Quatrième ligne - Nous obtenons le reste de la seconde après avoir divisé par le nombre de secondes d'un mois. Ensuite, nous divisons cela par le nombre de secondes dans une journée… .. Nous pourrions simplement utiliser le texte suivant pour les jours….

int days = totalSeconds / 86400;

Mais si nous utilisions la ligne ci-dessus et si nous voulions continuer et obtenir des mois, nous nous retrouverions avec 1 mois et 30 jours lorsque nous voulions seulement 1 mois.

Ouvrez une aire de jeu dans Xcode et essayez-la.

9
Sean Marraffa

La méthode la plus privilégiée dans objective-c pourrait être celle-ci, comme le recommande Apple dans leur 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);

Veillez à ne pas récupérer les composants non définis avec unitFlags, le nombre entier sera "indéfini".

6
JeanNicolas

Utilisez la fonction intégrée strftime ():

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;
}
3
Craig Detrick

Juste une modification pour les deux compatibles avec 32 bits et 64 bits. En utilisant NSInteger, le système sera automatiquement converti en int ou long en 32/64 bits.

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

De la même manière, vous pouvez convertir en jours, semaines, mois, années

2
Tai Le Anh

Voici mon algorithme pour convertir les secondes en secondes, minutes et heures (en n'utilisant que le nombre total de secondes et la relation entre chacune d'elles):

int S = totalSeconds % BaseSMH

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

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

Et voici mon explication à ce sujet:

Temps de test converti en secondes: HH: MM: SS = 02:20:10 => totalSeconds = 2 * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

La base entre les secondes -> minutes et les minutes -> heures est de 60 (à partir de secondes -> heures, il s'agit de 60 ^ 2 = 3600).

int totalSeconds = 8410
const int BaseSMH = 60

Chaque unité (représentée ici par une variable) peut être calculée en supprimant l'unité précédente (exprimée en secondes) du nombre total de secondes et en la divisant par sa relation entre les secondes et l'unité que nous essayons de calculer. Voici à quoi ressemble chaque calcul en utilisant cet algorithme:

int S = totalSeconds % BaseSMH

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

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

Comme dans tous les calculs, nous pouvons maintenant substituer chaque unité dans les calculs de minutes et d’heures à la méthode utilisée pour calculer l’unité précédente. Chaque calcul ressemblera à ceci: l'un sur l'autre):

int S = totalSeconds % BaseSMH

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

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

Tester avec "totalSeconds" et "BaseSMH" ci-dessus ressemblera à ceci:

int S = 8410 % 60

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

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

Calculer S:

int S = 8410 % 60 = 10

Calculer M:

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

Calculer 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

Avec cela, vous pouvez ajouter l’unité de votre choix, il vous suffit de calculer la relation entre les secondes et l’unité souhaitée. J'espère que vous comprenez mes explications de chaque étape. Si non, il suffit de demander et je peux expliquer plus loin.

1

Vous obtiendrez des jours, des heures, des minutes et des secondes à partir du nombre total de secondes (self.secondsLeft)

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

Code......

  [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]);
}
0
Deepak Nair

Au départ, j'ai élaboré une solution similaire à celle du poisson:

const secondsToString = s => {
  const secondsOfYear = 60 * 60 * 24 * 365;
  const secondsOfDay = 60 * 60 * 24;
  const secondsOfHour = 60 * 60;
  const secondsOfMinute = 60;

  let y = ~~(s / secondsOfYear);    s %= secondsOfYear;
  let d = ~~(s / secondsOfDay);     s %= secondsOfDay;
  let h = ~~(s / secondsOfHour);    s %= secondsOfHour;
  let m = ~~(s / secondsOfMinute);  s %= secondsOfMinute;

  y = (y > 0 ? (y + 'y ') : '');
  d = (d > 0 ? (d + 'd ') : '');
  h = (h > 0 ? (h + 'h ') : '');
  m = (m > 0 ? (m + 'm ') : '');
  s = (s > 0 ? (s + 's ') : '');

  return y + d + h + m + s;
}

J'ai remarqué qu'il pourrait être généralisé avec les fonctions array map() et reduce() car il inclut des itérations et des récursions. 

const intervalToLevels = (interval, levels) => {
  const cbFun = (d, c) => {
    let bb = d[1] % c[0],
      aa = (d[1] - bb) / c[0];
    aa = aa > 0 ? aa + c[1] : '';

    return [d[0] + aa, bb];
  };

  let rslt = levels.scale.map((d, i, a) => a.slice(i).reduce((d, c) => d * c))
    .map((d, i) => ([d, levels.units[i]]))
    .reduce(cbFun, ['', interval]);
  return rslt[0];
};

const TimeLevels = {
  scale: [365, 24, 60, 60, 1],
  units: ['y ', 'd ', 'h ', 'm ', 's ']
};
const secondsToString = interval => intervalToLevels(interval, TimeLevels);

Vous pouvez facilement étendre la fonction intervalToLevels() à d’autres niveaux de mesure, tels que la masse, la longueur, etc. du liquide.

const LengthLevels = {
  scale: [1760, 3, 12, 1],
  units: ['mi ', 'yd ', 'ft ', 'in ']
};
const inchesToString = interval => intervalToLevels(interval, LengthLevels);

const LiquidsLevels = {
  scale: [4, 2, 2, 8, 1],
  units: ['gal ', 'qt ', 'pt ', 'cup ', 'fl_oz ']
};
const ouncesToString = interval => intervalToLevels(interval, LiquidsLevels);

0
timothyzhang
    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
Vela