mktime()
C または C++ 標準から検索します。strptime()
ISO 8601 時刻を に変換するようなものが必要ですstruct tm
(またはsscanf()
、または ... を使用できます)。次に、構造の 2 つのコピーを作成tm_min
し、一方を +20 で、もう一方を -20 で調整し、 を呼び出しmktime()
、次にを呼び出しますstrftime()
。
これは、C および C++98、C++2003、C++2011 で機能します。C++2011 でのみ動作させたい場合は、に移動する必要がありますstd::chrono
。
サンプルコード
このコードはヘッダーのために C++ 用ですが、 と に変更することで C に変換でき<time.h>
ます<stdio.h>
。はい、おそらく「優れた」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