2011-01-10 7 views
0

時間、日付、およびタイムゾーンの入力からtime_tを作成する関数を作成しました。この関数は、LinuxやSolarisでも正常に機能します。しかし、私はWindows 7でCygwinで奇妙な動作が期限切れになっています.Cygwinでは、各テストで同じ時間が表示されます。Cygwinで時間計算が失敗する

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

time_t create_time(const char* time_s, const char* date_s, const char* zone_s) { 
    time_t now; 
    char *old_tz; 
    struct tm *comptime; 
    int x, y, z; 

    time(&now); 
    old_tz = getenv("TZ"); 

    if (setenv("TZ", zone_s, 1)) { 
     printf("Can't set environment variable TZ to %s\n", zone_s); 
     return (time_t)(-1); 
    } 
    comptime = localtime(&now); 

    if (time_s) { 
     if (2 == sscanf(time_s, "%d:%d", &x, &y)) { 
      comptime->tm_hour = x; 
      comptime->tm_min = y; 
     } 
     else { 
      return (time_t)(-1); 
     } 
    } 
    if (date_s) { 
     if (3 == sscanf(date_s, "%d-%d-%d", &x, &y, &z)) { 
      comptime->tm_year = x-1900; 
      comptime->tm_mon = y-1; 
      comptime->tm_mday = z; 
     } 
     else { 
      return (time_t)(-1); 
     } 
    } 
    comptime->tm_sec = 0; 

    now = mktime(comptime); 

    if (old_tz) setenv("TZ", old_tz, 1); 
    else unsetenv("TZ"); 

    return now; 
} 

int main(int argc, char** argv) { 
    char buffer1[32]; 
    char buffer2[32]; 
    char buffer3[32]; 
    char *time_s; 
    char *date_s; 
    char *zone_s; 
    int offset; 
    time_t rawtime; 

    time(&rawtime); 
    printf("Local time: %s", asctime(localtime(&rawtime))); 
    printf("GMT time: %s", asctime(gmtime(&rawtime))); 

    /* Test first version */ 
    puts("\nTest 1"); 
    strcpy(buffer1, "11:30"); 
    strcpy(buffer2, "2011-01-07"); 
    strcpy(buffer3, "CET"); 
    offset = 60; 

    time_s = buffer1; 
    date_s = buffer2; 
    zone_s = buffer3; 

    printf("Input: %s %s %s\n", date_s, time_s, zone_s); 
    rawtime = create_time(time_s, date_s, zone_s); 

    if ((time_t)(-1) == rawtime) { 
     strcpy(buffer1, "Error in time expression\n"); 
    } 
    else { 
     strcpy(buffer1, ctime(&rawtime)); 
    } 
    printf("Local time (%s): %s", zone_s, buffer1); 

    /* Test second version */ 
    puts("\nTest 2"); 
    strcpy(buffer1, "11:30"); 
    strcpy(buffer2, "2011-01-07"); 
    strcpy(buffer3, "GMT"); 
    printf("Input: %s %s %s\n", date_s, time_s, zone_s); 
    rawtime = create_time(time_s, date_s, zone_s); 

    if ((time_t)(-1) == rawtime) { 
     strcpy(buffer1, "Error in time expression\n"); 
    } 
    else { 
     strcpy(buffer1, ctime(&rawtime)); 
    } 
    printf("Local time (%s): %s", zone_s, buffer1); 

    return 0; 
} 

この(誤動作)の原因は何ですか?

ありがとう、

Martin。

答えて

0

Windowsは、UTC時刻を明示的に尋ねることを除いて、どこからでもローカルに時刻を入れます(そしてCygwinに従います)。これはあなたの誤動作ではない、あなたのコードは正しいです。あなたはGoogleの詳細をGoogleに知らせることができます。

あなたがPython(java、ruby、php、....)のソースコードを掘り下げて試してみると、正しい判断を下すためにその動作方法を確認することができます。

+0

したがって、mktime()はWindows呼び出しにマップされているため、CygwinのTZの値を無視します。あれは正しいですか? –

+2

http://www.devdaily.com/scw/c/cygwin/src/newlib/libc/time/mktime.c.shtml OSコールはありません –

+0

Windows OSのスクリプト言語では時間に関する多くの問題があります –