2

1941 年 7 月 3 日 (00:00:00) と 1941 年 7 月 4 日 (00:00:00) の mktime の戻り値は予想外です。2 つの違いは 82800 秒で、1 時間 (3600) 不足しています。

C プログラム diff1941.c (以下を参照) は、次を示しています。

    $> diff1941

    july3=-899337600i
    diff:82800 should be 86400

最初は TZ データベースの時間シフトだと思っていましたが、私の知る限り、zdump コマンドによると、1941 年にはそのようなシフトはありません。

    zdump -v -c 1940,1943 /etc/localtime

    /etc/localtime  Sun Feb 25 01:59:59 1940 UT = Sun Feb 25 01:59:59 1940 WET isdst=0 gmtoff=0
    /etc/localtime  Sun Feb 25 02:00:00 1940 UT = Sun Feb 25 03:00:00 1940 WEST isdst=1 gmtoff=3600
    /etc/localtime  Fri Jun 14 21:59:59 1940 UT = Fri Jun 14 22:59:59 1940 WEST isdst=1 gmtoff=3600
    /etc/localtime  Fri Jun 14 22:00:00 1940 UT = Sat Jun 15 00:00:00 1940 CEST isdst=1 gmtoff=7200
    /etc/localtime  Mon Nov  2 00:59:59 1942 UT = Mon Nov  2 02:59:59 1942 CEST isdst=1 gmtoff=7200
    /etc/localtime  Mon Nov  2 01:00:00 1942 UT = Mon Nov  2 02:00:00 1942 CET isdst=0 gmtoff=3600

だからこの時点で私は混乱しています。プログラムに見えないバグがある (可能性あり) か、lib C mktime 関数にバグがある (可能性は低い) か、TZ データベースに何か微妙なものがあり、それを見つけることができない (可能性がある): どうすればよいかあなたはそれを考えますか?

私は使っている:

  • Ubuntu 20.04 64 ビット、
  • libc 2.31-0ubuntu9、
  • tzdata 2019c-3ubuntu1
  • /usr/share/zoneinfo/Europe/Paris の /etc/localtime ポイント

diff1941.c:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

long int stamp(int d,int m,int y)
{
   struct tm date;
   memset(&date,0,sizeof(date));

   date.tm_mday=d;
   date.tm_mon=m-1;
   date.tm_year=y-1900;

   return mktime(&date);
}

int main(int argc, char **argv)
{
    if (argc>1)
        setenv("TZ","0",1);
    long int july3=stamp(3,7,1941);
    long int july4=stamp(4,7,1941);

    printf("july3=%ldi\n",july3);
    printf("diff:%ld should be 86400\n",july4-july3);
}
4

1 に答える 1