0

我正在使用类型变量编辑时间值struct tm(在 中添加几秒钟tm->tm_sec),但是在执行mktime(&t).

在 Linux 中这样做可以得到正确的结果,但在 AIX 中则不然。可能是什么问题呢?

#include <stdio.h>
#include <time.h>
#include <langinfo.h>
#include <locale.h>
int main ()
{
struct tm tm;
struct tm *end;
time_t t;
char str[20] = {'\0'};

//if (strptime("7 Feb 2013 01:47:30", "%d %b %Y %H:%M:%S", &tm) == NULL)
if (strptime("2012-10-17-01-07-30", "%Y-%m-%d-%H-%M-%S", &tm) == NULL)
{printf("Error\n");
}
tm.tm_sec = (tm.tm_sec + 1200);
//tm.tm_sec = 12;
//t = mktime(&tm);
//t = t + 12;
//end =localtime(&t);
strftime(str,20,"%Y %m %d %H %M %S",&tm);
printf("str is %s\n",str);

return 0;
}
4

2 回答 2

2

我相信正确的答案是使用time_t,这是一个很大的数字,表示自 1970 年 1 月 1 日午夜以来的秒数。在这里添加任意秒数变得非常简单。

我希望如果您只是在 中添加秒数tm->tm_sec,它会溢出,这会导致结果不正确。如果你不走运,你需要以秒为单位将你的变化一直持续到一年(2013 年 12 月 31 日 23:59:56 增加 5 秒将带你到 2014 年 1 月 1 日 00:00:01)。当然可以,但不是:

t =+ 5;

你沿着这条线走了大约十几步

tm.tm_sec += 5;
如果 (tm.tm_sec >= 60) { tm.tm_sec -= 60; tm.tm_min += 1; if (tm.tm_min >= 60) { ... 等等 ... } }

如果你在一个月内溢出天数,它会变得更有趣,因为你必须考虑每个月的天数,28、29、30 或 31,具体取决于哪个月 [以及是否是闰年或不]。

于 2013-02-08T11:40:30.940 回答
0

这实际上是 Mats 所说的:

#include <stdio.h>
#include <time.h>
#include <langinfo.h>
#include <locale.h>
int main ()
{
  struct tm tm;
  time_t t;
  char str[20] = {'\0'};

  if (strptime("2012-10-17-01-07-30", "%Y-%m-%d-%H-%M-%S", &tm) == NULL) {
    printf("error\n");
  }
  t = mktime(&tm);
  t += 1200;
  tm = *localtime(&t);
  strftime(str,20,"%Y %m %d %H %M %S",&tm);
  printf("str is %s\n",str);

  return 0;
}

产生:

cc -o t t.c && ./t
str is 2012 10 17 02 27 30
于 2013-02-08T23:57:08.360 回答