もう一つ質問が、タイムゾーンをヨーロッパ/ベルリンすなわち、現在の時刻に設定されているCESTあるtm_isdstがフラグを無視します。システムコールはmktimeは、mktime関数とDST</p> <p>のLinux、Ubuntuのに関する
は今、私は次のコードを実行しよう:
#include <stdio.h>
#include <time.h>
int main()
{
struct tm tm = {0};
int secs;
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 12;
tm.tm_mon = 9 - 1;
tm.tm_mday = 30;
tm.tm_year = 2016 - 1900;
tm.tm_isdst = 0;
secs = mktime(&tm);
printf("%i\n", secs);
tm.tm_isdst = 1;
secs = mktime(&tm);
printf("%i\n", secs);
tm.tm_isdst = -1;
secs = mktime(&tm);
printf("%i\n", secs);
return 0;
}
をし、間違ったすべての3つのケースである
1475233200
1475233200
1475233200
を得る(1時間オフセット):だから
>date -d @1475233200
Fri Sep 30 13:00:00 CEST 2016
私は少し困惑しています、私のタイムゾーンは何とか壊れていますか? tm_isdstフラグが完全に無視されるのはなぜですか?
編集:@名詞Animalは答えました:mktimeはtm_hourを変更します!私はそれが文書化されているのだろうか?
#include <stdio.h>
#include <time.h>
void reset(struct tm* tm){
(*tm) = (const struct tm){0};
tm->tm_sec = 0;
tm->tm_min = 0;
tm->tm_hour = 12;
tm->tm_mon = 9 - 1;
tm->tm_mday = 30;
tm->tm_year = 2016 - 1900;
}
int main()
{
struct tm tm;
int secs;
reset(&tm);
tm.tm_isdst = 0;
secs = mktime(&tm);
printf("%i\n", secs);
reset(&tm);
tm.tm_isdst = 1;
secs = mktime(&tm);
printf("%i\n", secs);
reset(&tm);
tm.tm_isdst = -1;
secs = mktime(&tm);
printf("%i\n", secs);
return 0;
}
が正常終了
1475233200
1475229600
1475229600
1)動作が奇妙に見えます。 'mktime()'として 'mktime(&tm);')を実行した後、**すべての**フィールドを再設定してください(または少なくとも印刷してください)2) 'tm'フィールドを調整することができます。 printf( "%lld \ n"、(long long)); '未定義の動作を避けるためにprintf("%i \ n "、(int)secs); – chux
*そうかもしれませんが、実際には奇妙ではありません。実際、['mktime()'](http://man7.org/linux/man-pages/man3/mktime.3.html)は、その引数、特に 'tm.tm_hour'と' tm。この場合、tm_isdst'フィールドに入力します。 –
@Nominal Animal 'odd 'とは、最初の2つのケースで、' tm'が主な範囲にあるので、 'mktime()'は 'tm'を変更するとは予想されません。 _hh_最初のケースではないかもしれません。うーん、夏時間の0のdstは1に変わるかもしれない。 – chux