2011-03-13 14 views
2

私は日付と時刻を文字列の形式で提供するシステムを持っています(たとえば、 "2011-03-13 03:05:00")。私はこの文字列を "2011-03-13 01:59:00"に受け取るかもしれません。文字列の中で現在と時間の間の時間の長さを知る必要があります(DST変更のため6分間)。Cの将来の日付のDSTフラグを検出

文字列を解析してtm構造体を作成し、mktimetime_tに変換するコードがあります。問題は、時間を解析するときにtm_isdstフラグを手動で設定する必要があるため、tm_isdstを設定する必要があるかどうかを検出する方法を探しています。何か案は?

アプリケーションに固有の2つの2AMがある場合の対処方法についてはいくつかアイデアがありますが、「この時間が現在のシステム時間だったら、DSTは実際には?

編集:アイデアはピートの提案に基づいています。同じ時間が、過去にした場合、

  • 現在の時刻に時間を追加してDSTフラグが変更された場合は以下を参照してください。私の場合:受信した時刻と現在のシステム時刻が異なる時間を持っている場合

    1. チェック。
    2. ((これは)今年の最もで同じ時間と将来の場合は、現在の時刻と同じDSTフラグを想定して)異なる時間ならば、我々は現在のシステム時刻に1時間を追加してDSTフラグが
    を変更するかどうかを確認

    思考?

  • 答えて

    1

    私は常にブルートフォースの方法でカウントしてください。 (

    1. は完全に時間文字列を解析し、
    2. は、その新しいのtime_tヴァルに6分を追加することのtm構造体上のtime_t valを取得するために()tm構造体へ
    3. コールはmktimeをそれを置く:これはうまくいくかもしれませんどのような値を6分間使用していますか?)
    4. asctimeから戻ってきたこのtm構造体のtime_t valからtm構造体を取得するには、asctime()などのtime_t valを
    5. ()、tm_isdstはあなたに何を伝えますか?

    - ピート

    はい、あなたは正しいです:時間の周り全体の混乱は非常に悪いです(でも悪意を持って、時には1は信じている)のプログラマをトリップすると完璧なクローズドブックのクイズを提供するように設計あなたのwhoresonの怠惰な/ペタニック/ばかげたCSのインストラクターのために。man mktimeによると

    +0

    OTOHとIMO、OPEN-bookテストのための良い質問です。 –

    5

    (Linuxでは、強調鉱山上):

    夏時間(DST)が時間 有効である かどうか フィールドは、mktime関数を(通知tm_isdstがで指定された値) tm 構造体で提供されます。正の値は、DST が有効であることを意味します。 0は、DSTが でないことを意味します。 負の値 は、DSTは 指定された時間で有効であるか否かはmktime()は を決定する試み( タイムゾーン情報及びシステム データベースにを使用する)必要があることを意味します。

    これを試しましたか?あなたが本当にあいまいな時間のために試みることができる

    (いくつかの時間は基本的にあいまいであるので、それの「決定しようとする試み」。)

    何かがmktimeがあなたのDSTフラグを「修正」かどうかを確認することです。私はこれは移植可能ではないと賭けるだろう。サンプルコードは、遷移が31/10/2010に設定され、午前3時には、私のタイムゾーン(ヨーロッパ/パリ)に午前2時にロールバック:

    #include <time.h> 
    #include <stdio.h> 
    #include <string.h> 
    
    void printit(int hour, int isdst) 
    { 
        struct tm when; 
        memset(&when, 0, sizeof(when)); 
        when.tm_sec = 0; 
        when.tm_min = 30; 
        when.tm_hour = hour; 
        when.tm_mday = 31; 
        when.tm_mon = 9; 
        when.tm_year = 110; 
        when.tm_isdst = isdst; 
        time_t secs = mktime(&when); 
        fprintf(stdout, "%2d %ld %d %s", isdst, secs, when.tm_isdst, asctime(&when)); 
    } 
    
    int main(int argc, char **argv) 
    { 
        for (int i=1; i<4; i++) { 
         fprintf(stdout, "At %dam\n", i); 
         printit(i, 1); 
          printit(i, 0); 
         printit(i, -1); 
        } 
    } 
    

    出力は次のとおりです。

    At 1am 
    1 1288481400 1 Sun Oct 31 01:30:00 2010 
    0 1288485000 1 Sun Oct 31 02:30:00 2010 
    -1 1288481400 1 Sun Oct 31 01:30:00 2010 
    At 2am 
    1 1288485000 1 Sun Oct 31 02:30:00 2010 
    0 1288488600 0 Sun Oct 31 02:30:00 2010 
    -1 1288488600 0 Sun Oct 31 02:30:00 2010 
    At 3am 
    1 1288488600 0 Sun Oct 31 02:30:00 2010 
    0 1288492200 0 Sun Oct 31 03:30:00 2010 
    -1 1288492200 0 Sun Oct 31 03:30:00 2010 
    

    あなたが見ることができるように、とき時間が相違していない場合は、を設定して時間をオフセットすることで、mktimeを修正します。 の場合、tm_isdstは変更されません。

    +0

    これは、2、2amsの問題のような時間に対して振る舞いが確定的である限り、試してみることができるものです – thelsdj

    +0

    私は、物事が決定的ではないはずの理由は見ません。残念なことに標準化されていないとして、mktimeはDSTの移行中にしたいと思うことを何とかすることができます。 – Mat

    +0

    マイナーポイント: 'time_t secs;を使用します。 printf( "%ld"、secs);は候補の[y2038](https://en.wikipedia.org/wiki/Year_2038_problem)バグです。 'time_t secsを提案する。 printf( "%lld"、(long long)); '(' time_t'をワイド数にキャストします)。 – chux

    0

    私はあなたと同じ質問がありますが、私はこの解決策がそれを修正できるかどうかわかりません?

    struct tm *local_tm; 
    time_t t; 
    t = time(NULL); 
    local_tm = localtime(&t); 
    local_tm->tm_year = 2012-1900; 
    local_tm->tm_mon = 9 - 1; 
    local_tm->tm_mday = 13; 
    time_t utc_time = mktime(local_tm); 
    

    私はそれは、システムからのTMを取得する場合、tm_isdstがフィールドが既に設定されていると思いますので、左のものはtm_isdstが除いた他のフィールドを変更ですが、私はそれが正しいかどうかわからないが、私はそれをしようとします、それが私のために働くならば、私はさらなるフィードバックを与えるでしょう。

    関連する問題