1970 年 1 月 1 日の午前 0 時 (UTC) (以前の time() の呼び出しの結果) から経過した秒数として表された時刻があります。この時間に 1 日を追加するにはどうすればよいですか?
24 * 60 * 60 を追加すると、ほとんどの場合は機能しますが、サマータイムがオンまたはオフになると失敗します。つまり、たいていは 24 時間追加しますが、23 時間または 25 時間追加することもあります。
説明する - プログラム:
#include <time.h>
#include <iostream>
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
time_t time = base + i * 24 * 60 * 60;
std::cout << ctime(&time);
}
return 0;
}
プロデュース:
Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006
3 月 12 日、13 日、... の時刻も午前 8 時にします。
FigBug によって提供された答えは、私を正しい方向に向けました。しかし、gmtime の代わりに localtime を使用する必要がありました。
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
std::cout << asctime(tm);
}
return 0;
}
ください:
Sat Mar 11 08:00:00 2006
Sat Mar 12 08:00:00 2006
Sat Mar 13 08:00:00 2006
Sat Mar 14 08:00:00 2006
それが私が欲しいものです。gmtime を使用すると、14:00:00 の時間が表示されます
ただし、すべて土日ですのでご注意ください。また、3 月 32 日、33 日などに移動します。mktime 関数を投入すると、最初の場所に戻ります。
#include <time.h>
#include <iostream>
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
time_t time = mktime(tm);
std::cout << asctime(tm);
}
return 0;
}
私に与えます:
Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006
私は何が欠けていますか???
OK、使用するFigBugの最新の提案を試しました:
std::cout << ctime(&time);
asctime の代わりに、同じ結果が得られます。したがって、ライブラリやコンパイラが台無しになっていると思います。Cygwin で g++ 3.4.4 を使用しています。ファイルを Solaris 5.8 にコピーし、そこで g++ 3.3 を使用してコンパイルしました。そこで正しい結果が得られます!実際、出力に ctime を使用しても asctime を使用しても、正しい結果が得られます。
Sat Mar 11 08:00:00 2006
Sun Mar 12 08:00:00 2006
Mon Mar 13 08:00:00 2006
Tue Mar 14 08:00:00 2006
g++ 3.4.6 を使用する Red Hut Linux でも、(両方の出力関数で) 正しい結果が得られます。
したがって、Cygwin のバグに遭遇したと思います。
皆様のご協力、ご助言をよろしくお願いいたします。...