Рассчитать минуты до определенного времени? (С) - PullRequest
0 голосов
/ 04 октября 2009

Какой самый простой способ рассчитать количество минут до 9 вечера (сегодня или завтра)?

Просматривал mktime (), но, похоже, было трудно узнать день и месяц, имея дело со всем этим.

Ответы [ 7 ]

2 голосов
/ 04 октября 2009

Просто подсчитайте дельту до сегодняшнего 9 вечера. Если оно отрицательное, добавьте 24 часа, чтобы получить дельту к завтрашнему 9 вечера.

#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[]) {
    struct tm* tm;
    time_t ts=time(NULL);
    if(tm=localtime(&ts)) {
            long int delta;
            tm->tm_hour = 21;
            tm->tm_min = 0;
            tm->tm_sec = 0;
            delta = mktime(tm) - ts;
            if(delta<0) {
                    delta+=24*60*60;
            }
            printf("%d minutes til (next)9pm\n",delta/60);
    }
    return 0;
}
1 голос
/ 04 октября 2009

Вот оно (вывод в секундах ...)

#include <stdio.h>
#include <time.h>

int main(void) 
{
  double dt = 0.0f;
  time_t ti = time(NULL);
  time_t tf;
  struct tm *pt_actual = localtime(&ti);

  struct tm t_actual = *pt_actual;
  struct tm t_target = *pt_actual;

  t_target.tm_hour = 21; // 09:00 pm
  t_target.tm_min = 0;

  tf = mktime(&t_target);

  dt = difftime(tf, ti);
  if (dt < 0)
    dt += (24*60*60);  // if negative, just consider **next** 9pm target, add a day

  printf("difftime = %f seconds\n", dt );
  return 0;
}
0 голосов
/ 04 октября 2009

Более глубокий, но менее полезный ответ заключается в том, что простого ответа не существует.

Откуда ты вообще знаешь, что сегодня будет 9 вечера? Хорошо, конечно, я уверен, что все существующие часовые пояса никогда не пропускают 21:00, но они пропускают часы посреди ночи раз в год.

Календари - это катастрофа сложности. Осторожно.

0 голосов
/ 04 октября 2009

C99 версия:

#include <math.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
    struct tm now = *localtime(&(time_t){ time(NULL) });
    struct tm then = now;
    then.tm_hour = 21;
    then.tm_min = 0;
    then.tm_sec = 0;
    int dt = ((int)round(
        difftime(mktime(&then), mktime(&now)) / 60) + 24 * 60) % (24 * 60);
    printf("time till 9pm: %i minutes\n", dt);
}
0 голосов
/ 04 октября 2009

Парень просит самый простой способ. Все ваши пути излишне сложны. Просто используйте модульную арифметику:

#include <stdio.h>
#include <time.h>

#define TARGET_TIME 21*60 // 9:00 PM, in format HH * 60 + MM

int main(int argc, char* argv[])
{
    struct tm* tm;
    time_t ts = time(NULL);
    int minutes_until_9pm;
    tm = localtime(&ts);
    minutes_until_9pm = 24*60 - (tm->tm_min + tm->tm_hour * 60 + TARGET_TIME)%(24*60);

    //alternatively, the following is slightly faster
    //minutes_until_9pm = 24*60 - (tm->tm_min + tm->tm_hour * 60 + TARGET_TIME) + (tm->tm_min+tm->tm_hour*60+TARGET_TIME>24*60?24*60:0);

    printf("%d minutes til (next)9pm\n", minutes_until_9pm);
    return 0;
}

Если вы знаете свой часовой пояс, все становится еще проще:

#include <stdio.h>
#include <time.h>

#define TARGET_TIME 21*60 // 9:00 PM, in format HH * 60 + MM
#define TIMEZONE (-6) // This is CST; replace with your own timezone

int main(int argc, char* argv[])
{
    int minutes_until_9pm = 24*60 - (time(NULL)/60 + TARGET_TIME + (24+TIMEZONE)*60)%(24*60);
    printf("%d minutes til (next)9pm\n", minutes_until_9pm);
    return 0;
}

Что здесь происходит, так это то, что по модулю один день мы получаем количество минут с полуночи. Затем мы добавляем 9:00 вечера, чтобы получить количество минут с 9:00 вечера. Затем мы вычитаем это из 24 часов, чтобы получить количество минут до следующих 9:00 вечера.

Если вам нужна более высокая точность (то есть, округленная до ближайшего числа минут, а не просто числа минут), просто вычтите (tm->tm_sec>=30?0:1) из minutes_until_9pm или замените time(NULL)/60 на (time(NULL)+30)/60 соответственно. *

0 голосов
/ 04 октября 2009

Простой способ - это рассчитать количество часов и минут (учитывая, сколько сейчас времени, плюс тот факт, что в сутки 24 часа), и умножить количество часов на 60, чтобы сделать его числом минут. В качестве альтернативы, вместо использования 24-часовых часов для выражения времени, используйте 1440-минутные часы: легко вычесть одно время из другого, чтобы получить разницу во времени.

0 голосов
/ 04 октября 2009

Это даст вам минуты до 9 вечера .:

time_t currenttime;
time_t ninePM;
struct tm * timeinfo;
int minutesUntilNine;

// Fill currenttime + convert to struct tm
time ( &currenttime );
timeinfo = localtime ( &rawtime );

// Check for after 9pm...
if (timeinfo->tm_hour >= 21) // Are we after 9pm?
  timeinfo->tm_day++; // increment our day

// Set timeinfo to the time you want...
timeinfo->tm_sec = 0;
timeinfo->tm_min = 0;
timeinfo->tm_hour = 21; // 9pm
ninePM = mktime( timeinfo );

minutesUntilNine = (ninePM - currenttime) / 60;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...