mktime()
从 C 或 C++ 标准查找。您需要strptime()
将 ISO 8601 时间转换为struct tm
(或者您可以使用sscanf()
, 或 ...) 之类的东西。然后制作你的结构的两份副本,在其中一个中调整tm_min
+20,在另一个中调整 -20,调用mktime()
,然后strftime()
。
这适用于 C 和 C++98、C++2003 以及 C++2011。如果您希望它仅适用于 C++2011,那么您需要转到std::chrono
.
示例代码
由于标头,此代码适用于 C++,但可以通过更改为<time.h>
and转换为<stdio.h>
C。是的,它可能算不上“好”的 C++;它肯定会给您留下一些界面决定。但它确实完成了工作。(对于纯 C++,您可以删除对 . 的引用struct
。)
#include <ctime>
#include <cstdio>
static void delta_t(const char *otime, int delta)
{
struct tm tm1;
int n;
if ((n = sscanf(otime, "%4d-%2d-%2d %2d:%2d:%2d", &tm1.tm_year, &tm1.tm_mon, &tm1.tm_mday,
&tm1.tm_hour, &tm1.tm_min, &tm1.tm_sec)) != 6)
{
printf("%s: failed %d\n", otime, n);
return;
}
printf("%.4d-%.2d-%.2d %.2d:%.2d:%.2d\n", tm1.tm_year, tm1.tm_mon, tm1.tm_mday,
tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
tm1.tm_isdst = -1;
tm1.tm_year -= 1900;
tm1.tm_mon--;
struct tm tm2 = tm1;
tm2.tm_min += delta;
struct tm tm3 = tm1;
tm3.tm_min -= delta;
mktime(&tm2);
mktime(&tm3);
char dt1[20];
char dt2[20];
char dt3[20];
strftime(dt1, sizeof(dt1), "%Y-%m-%d %H:%M:%S", &tm1);
strftime(dt2, sizeof(dt2), "%Y-%m-%d %H:%M:%S", &tm2);
strftime(dt3, sizeof(dt3), "%Y-%m-%d %H:%M:%S", &tm3);
printf("Input: %s\n", otime);
printf("Date1: %s\n", dt1);
printf("Date2: %s\n", dt2);
printf("Date3: %s\n", dt3);
}
int main(void)
{
delta_t("2010-01-25 18:02:00", 20);
delta_t("2012-12-31 23:59:00", 20);
return(0);
}
样本输出:
2010-01-25 18:02:00
Input: 2010-01-25 18:02:00
Date1: 2010-01-25 18:02:00
Date2: 2010-01-25 18:22:00
Date3: 2010-01-25 17:42:00
2012-12-31 23:59:00
Input: 2012-12-31 23:59:00
Date1: 2012-12-31 23:59:00
Date2: 2013-01-01 00:19:00
Date3: 2012-12-31 23:39:00