用C计算未来的纪元时间

时间:2014-11-04 07:09:33

标签: c linux

我想计算当前日期后3个月后的大纪元时间。以下代码给了我当前的一个:

time_t t = time(0);   // get time now
printf("Time=%ld\n", t);

是否有任何Linux / Unix api可以获得此功能? 注意:将考虑闰年和月份的变化。计算将根据当前系统时区设置和日历(Linux OS) 感谢。

1 个答案:

答案 0 :(得分:4)

原则上,localtime()mktime()的组合将允许您这样做:

time_t now = time(0);
struct tm *tp = localtime(&now);
tp->tm_mon += 3;
time_t then = mktime(tp);

mktime()功能还会调整tp的成员是合适的。尝试在月末(例如11月30日+ 3个月)发生的事情。有一个"你得到你得到的东西" (或者可能"你得到你应得的东西");将月份添加到日期是一种定义不明确的操作。如果您的mktime()没有达到您认为需要的效果,那么您需要考虑是自己编写还是搜索符合您需要的版本。您肯定应该拥有一套包含已知答案的全面测试用例,并验证您的mktime()是否会产生您希望它生成的答案。

例如:

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

static void check_time(time_t now, int n_months)
{
    struct tm *tp = localtime(&now);
    char time_buf[64];
    printf("%10lu + %d months\n", (unsigned long)now, n_months);
    strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", tp);
    printf("  %10lu = %s\n", (unsigned long)now, time_buf);
    tp->tm_mon += n_months;
    time_t then = mktime(tp);
    strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", tp);
    printf("  %10lu = %s\n", (unsigned long)then, time_buf);
}

int main(void)
{
    time_t times[] =
    {
        1322504430, // 2011-11-28 10:20:30 -08:00
        1322590830, // 2011-11-29 10:20:30 -08:00
        1322677230, // 2011-11-30 10:20:30 -08:00
        1417198830, // 2014-11-28 10:20:30 -08:00
        1417285230, // 2014-11-29 10:20:30 -08:00
        1417371630, // 2014-11-30 10:20:30 -08:00
        1391192430, // 2014-01-31 10:20:30 -08:00
    };

    enum { NUM_TIMES = sizeof(times) / sizeof(times[0]) };

    for (int i = 0; i < NUM_TIMES; i++)
        check_time(times[i], 3);

    return 0;
}

Mac OS X 10.10的输出示例:

1322504430 + 3 months
  1322504430 = 2011-11-28 10:20:30
  1330453230 = 2012-02-28 10:20:30
1322590830 + 3 months
  1322590830 = 2011-11-29 10:20:30
  1330539630 = 2012-02-29 10:20:30
1322677230 + 3 months
  1322677230 = 2011-11-30 10:20:30
  1330626030 = 2012-03-01 10:20:30
1417198830 + 3 months
  1417198830 = 2014-11-28 10:20:30
  1425147630 = 2015-02-28 10:20:30
1417285230 + 3 months
  1417285230 = 2014-11-29 10:20:30
  1425234030 = 2015-03-01 10:20:30
1417371630 + 3 months
  1417371630 = 2014-11-30 10:20:30
  1425320430 = 2015-03-02 10:20:30
1391192430 + 3 months
  1391192430 = 2014-01-31 10:20:30
  1398968430 = 2014-05-01 11:20:30

如果您不喜欢1月31日(即5月1日)之后3个月(以及2月1日之后的3个月),则mktime()的Mac OS X 10.10版本不适合您。