エポックからの秒単位のローカル(タイムゾーンオフセットあり)の現在時刻が必要です。次のコードは、不要な中間一時構造tmを作成するため、少し不器用に見えます。なぜ私が取得する必要がないのtime_tに変換後、TMに戻すためにtime_tの?もっと良い方法はありますか?
time_t ct = time(0);
tm lct = tm();
localtime_s(&lct, &ct);
ct = _mkgmtime(&lct);
ポータブルCで現地時間を(タイムゾーンとDSTを適用して)取得したい場合は、はい、通常は2段階の手順です。エポックからの時間から始めて、最初に呼び出してlocaltime
から、結果の内訳struct tm
。(通常、次に行うのは電話strftime
です。)
を呼び出しctime
て、現地時間の文字列を直接取得することもできます。
さまざまな関数呼び出しが含まれる理由は、残念ながら、いくつかの異なる時間形式が使用されているためです。(その理由は、日付と時刻が複雑であるためです!)1970年以降、時間を秒で表すことができます。として表すことができstruct tm
ます。文字列として表すことができます(数十億の形式の1つ)。UnixおよびLinuxでは、struct timeval
またはとして表すことができますstruct timespec
。
しかし、あなたが発見したように、簡単で標準的な方法がないことの1つは、1970年以降の現地時間を秒単位で取得することです。しかし、その理由は、それがあまり有用な表現ではないためです。一般に、日付/時刻の値を使用して実行する可能性のある2つのことがあります。(1)計算を実行するか、(2)ユーザーに表示します。ユーザーに表示したい場合は、おそらく現地時間で表示したいので、人間が読める形式で任意の形式で現地時間に変換する方法はたくさんあります。(私が言ったように、通常の方法は、を呼び出すことですlocaltime
、そしてstrftime
。)しかし、計算を実行したい場合、実際にそれらを実行する唯一の方法は、UTCで1970年以降の秒を使用することです。これにより、他のすべての厄介な問題が解消されます。月には何日ありますか?うるう年ですか?私たちはどのタイムゾーンにいますか?夏時間は有効ですか?
ただし、1970年以降、現地時間を秒で表現しようとすると、おそらく気が狂います。たとえば、現在、時刻は1460383736で、これは14:08:56UTCです。私が座っている場所は、10:08:56 EDT(米国東部時間、DSTが有効)です。つまり、現地時間の1970年から1460369336秒だと言えるでしょう。しかし、私が座っている場所でも、1460369336秒前は1970年1月1日の深夜ではありませんでした。実際には1969年12月31日の午後11時でした。1時間ずれています。その理由は、DSTが有効になっていないためです。 1970年1月1日。
つまり、この「1970年以降の秒数を現地時間として」の値を計算することは可能ですが、それは奇妙なことであり、そうなる可能性が高いため、現地時間の処理方法を再考することをお勧めします。より単純なスキームを使用した場合よりも回避するのがはるかに難しいさまざまな問題が発生します。
あなたが本当にしたい場合はしかし、ここであなたが呼び出すことなく、UTCおよび現地時間の間のオフセットを決定することができるかもしれない2つの方法がありgmtime
かは_mkgmtime
:
localtime
して、tm_gmtoff
フィールドを見てください。(残念ながら、このフィールドは非標準であり、すべてのシステムに存在するわけではありません。)ftime
関数を呼び出して、のtimezone
フィールドを確認しstruct timeb
ます。(ここにいくつかの落とし穴があります:ftime
時代遅れで非標準であるだけでなく、timezone
フィールドは数分であり、グリニッジの西のゾーンでは正ですtm_gmtoff
が、負です。)しかし、とにかく、それらは多かれ少なかれ直接、UTCの1970年以降の秒数を加算または減算して「ローカル」の1970年以降の秒数を取得する数値を提供します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加