Конвертировать секунды в дни, минуты и часы в Obj-c - PullRequest
22 голосов
/ 21 февраля 2009

Как в target-c как преобразовать целое число (представляющее секунды) в дни, минуты, часы?

Спасибо!

Ответы [ 11 ]

43 голосов
/ 21 февраля 2009

В этом случае вам просто нужно разделить.

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;

Для более сложных вычислений дат, таких как количество дней в десяти миллионах секунд после 15:00 19 января 1983 года, вы должны использовать класс NSCalendar вместе с NSDateComponents. Здесь вам поможет руководство по программированию даты и времени от Apple.

34 голосов
/ 05 ноября 2010

попробуйте это,

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

и вы можете использовать его для получения более подробной информации о днях, неделях, месяцах и годах, следуя той же процедуре

9 голосов
/ 06 февраля 2015

Я знаю, что это старая запись, но я все равно хотел поделиться. Следующий код - это то, что я использую.

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

Первая строка - мы получаем остаток секунд при делении на количество секунд в минутах.

Вторая строка - мы получаем остаток секунды после деления на количество секунд в часе. Затем мы делим это на секунды в минуту.

Третья строка - мы получаем остаток секунд после деления на количество секунд в дне. Затем мы делим это на количество секунд в часе.

Четвертая строка - мы получаем остаток секунды после деления на количество секунд в месяце. Затем мы делим это на количество секунд в дне. Мы могли бы просто использовать следующее для Дней ...

int days = totalSeconds / 86400;

Но если бы мы использовали вышеприведенную строку и хотели продолжить и получать месяцы, у нас был бы 1 месяц и 30 дней, когда мы хотели получить только 1 месяц.

Откройте игровую площадку в Xcode и попробуйте.

6 голосов
/ 22 апреля 2012

Наиболее предпочтительным способом в target-c может быть этот, как рекомендует Apple в своем документе.

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

Убедитесь, что не извлекаются компоненты, не определенные с помощью unitFlags, целое число будет «неопределено».

3 голосов
/ 16 марта 2012

Используйте встроенную функцию 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;
}
2 голосов
/ 06 февраля 2015

Просто небольшая модификация для обоих, совместимых с 32-битными и 64-битными. При использовании NSInteger система автоматически преобразуется в int или long на основе 32/64 бита.

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

Таким же образом вы можете конвертировать в дни, недели, месяцы, годы

1 голос
/ 18 октября 2017

Это мой алгоритм для преобразования секунд в секунды, минуты и часы (только с использованием общего количества секунд и отношения между каждым из них):

int S = totalSeconds % BaseSMH

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

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

И вот мое объяснение этого:

Время теста в секундах: ЧЧ: ММ: СС = 02:20:10 => общее количество секунд = 2 * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

База между секундами -> минутами и минутами -> часами - 60 (из секунд -> часов - 60 ^ 2 = 3600).

int totalSeconds = 8410
const int BaseSMH = 60

Каждую единицу (здесь представленную переменной) можно рассчитать, удалив предыдущую единицу (выраженную в секундах) из общего количества секунд и разделив ее на отношение между секундами и единицей, которую мы пытаемся вычислить. Вот как выглядит каждый расчет с использованием этого алгоритма:

int S = totalSeconds % BaseSMH

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

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

Как и во всей математике, теперь мы можем заменить каждую единицу в вычислениях минут и часов на то, как мы вычислили предыдущую единицу, и каждый расчет будет выглядеть следующим образом (помните, что деление с BaseSMH в вычислении M и умножение на BaseSMH в H вычисление отменяет друг друга):

int S = totalSeconds % BaseSMH

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

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

Тестирование с "totalSeconds" и "BaseSMH" сверху будет выглядеть так:

int S = 8410 % 60

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

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

Расчет S:

int S = 8410 % 60 = 10

Расчет М:

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

Расчет 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

При этом вы можете добавить любую единицу измерения, которую хотите, вам просто нужно вычислить соотношение между секундами и единицей, которую вы хотите. Надеюсь, вы понимаете мои объяснения каждого шага. Если нет, просто спросите, и я могу объяснить дальше.

0 голосов
/ 08 июля 2018

Изначально я разработал решение, похожее на ответ рыбы:

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

Я заметил, что его можно обобщить функциями массива map() и reduce(), поскольку он включает в себя несколько итераций и рекурсий.

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

Вы можете легко расширить функцию intervalToLevels() на другие уровни измерения, такие как масса жидкости, длина и т. Д.

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 голосов
/ 05 октября 2016

Вы получите дни, часы, минуты и секунды из общего количества секунд (self.secondsLeft)

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

код ......

  [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 голосов
/ 03 февраля 2016

Попробуйте сделать следующее:

    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" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...