计算分钟直到特定时间? (C)

时间:2009-10-03 22:23:52

标签: c time

到晚上9点(今天或明天)计算分钟数的最简单方法是什么?

正在寻找mktime(),但似乎很难得到#和月的一天,处理所有这些。

7 个答案:

答案 0 :(得分:2)

只计算到今天晚上9点的增量。如果它是负数,则添加24小时以获得明天的明天的增量。

#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 :(得分:1)

这是(以秒为单位输出......)

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

答案 2 :(得分:0)

这将给你分钟直到晚上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;

答案 3 :(得分:0)

一种简单的方法是计算小时数和分钟数(考虑到现在的时间,加上一天中有24小时的事实),并将小时数乘以60,使其成为分钟。或者,不要使用24小时制来表示时间,而是使用1440分钟的时钟:可以很容易地从另一个时间减去一次,以获得时差。

答案 4 :(得分:0)

这家伙要求最简单的方式。你所有的方式都是不必要的复杂。只需使用模运算:

#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点开始添加,以获得自晚上9点以来的分钟数。然后我们从24小时减去这个数字,得到分钟数,直到下一个晚上9点。

如果您需要更高的准确度(即四舍五入到最接近的分钟数,而不是简单的分钟数),只需从(tm->tm_sec>=30?0:1)中减去minutes_until_9pm,或用{{替换time(NULL)/60 1}},分别。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

更深刻的,如果不太有帮助,答案是没有简单的答案。

你怎么知道今天晚上9点会有?好吧,当然,我确信所有存在的时区都不会跳过21:00,但是他们每年都会在半夜跳过几个小时。

Calendrics是一场复杂的灾难。当心。