2011-12-19 21 views
11

多くの異なる見方があるので、ここで質問しました。mktimeとtm_isdst

私はman mktimeをお読みください。

(A positive or zero value for tm_isdst causes mktime() to presume initially 
that summer time (for example, Daylight Saving Time) is or is not in 
effect for the specified time, respectively. A negative value for 
tm_isdst causes the mktime() function to attempt to divine whether summer 
time is in effect for the specified time. 

私の質問は、tm_isdstはそのDSTかないとコードはDSTとらわれないなる方法ならば、システムが決定させるために-1として保持すべきではないですか?

私に何かが不足していますか?

答えて

5

私はその元の理由はいくつかのタイムゾーンは夏時間を持たないと考えています。 mktimeは非同期セーフではないし、リエントラントなので、実装は夏時間の現在の値を昼光[0または1]でインデックス付けされたPOSIX extern char tzname [2]に格納することができます。これは、tzname [0] = "[標準TZ名]"で、tzname = "[夏時間TZ名、EDTなど]"

これについての詳細は、tzset()のマニュアルページを参照してください。 mktime()に準拠している標準は、とにかくtzset()を呼び出したように動作する必要があります。この種のものは、tm_isdst、IMOの使用を排除します。

結論:特定の実装とタイムゾーンは、tm_isdstに-1、0、または1を使用するかどうかを指定します。すべての実装のためのデフォルトの正しい方法はありません。

7

可能であれば、tm_isdstを-1に設定しないでください。システムは、日付と時刻のみからDSTのステータスを判断するとは限りません。 DSTが終了する前後の時間はあいまいです。たとえば、mktime()を2012年11月4日午前1時30分に渡した場合、それはmktime()から正しいtime_t値を取得するのに十分な情報ではありません。通常私はmktime()があいまいな場合の標準時刻を想定していますが、すべてのプラットフォームでその動作を保証するドキュメントは見ていません。 2012年11月4日午後1時30分、tm_isdst == 1で1時間前となります。これは、時間が1:00:00から1:59:59まで繰り返されるためです。

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

int main() 
{ 
    time_t daylight, standard; 
    struct tm timestr; 
    double diff; 

    timestr.tm_year = 2012 - 1900; 
    timestr.tm_mon = 11 - 1; 
    timestr.tm_mday = 4; 
    timestr.tm_hour = 1; 
    timestr.tm_min = 30; 
    timestr.tm_sec = 0; 

    /* first with standard time */ 
    timestr.tm_isdst = 0; 
    standard = mktime(&timestr); 

    /* now with daylight time */ 
    timestr.tm_isdst = 1; 
    daylight = mktime(&timestr); 

    diff = difftime(standard, daylight); 

    printf("Difference is %f hour(s)", diff/60.0/60.0); 

    return 0; 
} 

これは生成:

Difference is 1.000000 hour(s) 

は両方2012年11月4日1:30である、しかし両方とも1時間離れて、二つの別個のtime_t値です。

  • 修復時間構造体
  • 時刻構造体は、入力と出力の両方である

    • のtime_t:

      mktime()は、本質的に2つの出力を有します。 mktime()によって変更され、すべての構造体メンバを公称範囲に戻します。たとえば、tm_hourメンバー+= 500を増やすと、時間が500時間増えます。 tm_hourのメンバーは00から59の値に変更され、tm_day,tm_mdayなどはすべてそれに応じて調整されます。 tm_isdstも入力と出力の両方です。

    • 0(DSTない効果で、すなわち

      • 1(効果にDST、すなわち夏時間):次のようにその値は標準時間)
      • -1(不明DSTステータス)

      そうはmktime()が出力のいずれかtm_isdstが1または0、決して-1。

      -1は可能です入力、しかし私はそれを "不明"を意味すると考えるでしょう。一般的にmktime()が自動的にそれを自動的に判断できるとは限らないため、「自動的に判断する」という意味ではないと考えてください。

      明示的なDSTステータス(0または1)は、ソフトウェアの外部からのものである必要があります(たとえば、ファイルまたはデータベースに格納するか、ユーザーに確認するなど)。

    +2

    DSTがわからない場合は、自分で決定する必要があります(その幸運を祈る)、または「-1」に設定してください。他の選択肢はありません。 0に設定した場合、DSTはまったく間違って保証されます.1に設定するとDSTに強制的に間違っていることが保証されます。 – rustyx

    +0

    @RustyX -1、0、または1へのハードコーディングは常に間違っています。 -1が最も悪いですが、それでも悪いです。明示的なステータス(0または1)は、ユーザからのソフトウェアへの入力、またはデータ(ファイルまたはデータベース)への格納でなければなりません。基本的には、アプリケーションの外部から何かが来なければなりません。 –

    +0

    v良い答え。ありがとう – drlolly

    関連する問題