2009-11-08 43 views

答えて

36

UTCで表される時間を取得するには、Win32 APIでGetSystemTimeを使用します。

SYSTEMTIME st; 
GetSystemTime(&st); 

SYSTEMTIMEこれら関連部材を有するように記載され:shf301は親切以下指摘

WORD wYear; 
WORD wMonth; 
WORD wDayOfWeek; 
WORD wDay; 
WORD wHour; 
WORD wMinute; 
WORD wSecond; 
WORD wMilliseconds; 

ように、(同じプロトタイプを持つ)GetLocalTimeは、ユーザの現在のタイムゾーンに補正時間をもたらします。

ここには、あなたが何をしているかによっていくつかの良い回答があります。 を探しているのならば、の時間帯、私の答えは最善の方法です。算定のための確かな日付が必要な場合は、Alex'sを考えてみてください。 Windowsにはa lot of ways to skin the time catがあり、その中には他のものよりも正確なものもあります(誰もまだQueryPerformanceCounterを挙げていません)。

+5

使用GetLocalTime時間を取得すると、ユーザーに表示される日付。 http://msdn.microsoft.com/en-us/library/ms724338%28VS.85%29.aspx – shf301

+2

QueryPerformanceCounter ...貧しい人々になる欠点が多いので、あなたは冗談かもしれないと思いますここでの選択。 –

+1

@Heath:ええ、申し訳ありませんが、それは明らかではありませんでした。 :) –

2

アプリケーションのニーズに応じて、6つの一般的なオプションがあります。このDr Dobbs Journal articleは、あなたに最良の情報を選択するために必要なすべての情報を提供します。この記事からのあなたの特定のケースで

、:

GetSystemTimeは()現在の システム時刻を取得し、 は年を含む別々の フィールドの数で構成されて SYSTEMTIME構造をインスタンス化し、月、日、 時間、分、秒、および ミリ秒です。

+1

私が間違っていても間違いはありますが、GetTickCountはoyurアプリケーションの起動から経過したミリ秒数を教えてくれませんか? – Mark

+1

はい、間違った見積もりを追加しました。ごめんなさい。私は今それを修正しました。 – Ash

+1

@マーク:システムがブートされたので。 Windows Vista以降の 'GetTickCount64'は、これを64ビットに拡張しました。前者は32に制限されています。 –

2

GetSystemTimeを最初に使用してください。それが必要な場合は、SYSTEMTIMEの構造上でSystemTimeToFileTimeと呼び出すことができます。 FILETIMEは、1エポック以来、100ナノ秒の間隔の64ビットカウントであり、算術にはより適しています。 SYSTEMTIMEは、予想されるすべてのフィールド(年、月、日、時など、ミリ秒まで)を持つ構造体です。たとえば、真夜中から何ミリ秒経過したかを知りたい場合は、2つの構造体(現時点のもの、適切なフィールドをゼロにした後に同じSYSTEMTIMEを変換したもの)を減算し、おそらく最も簡単な方法は10です。

+0

Jed、右、メモリからの書き込み、アンダースコアがあると思った。 –

+0

それは私が考えたものです。 :) –

41

最も簡単な(そして最も直接的な)方法は、深夜01月01日1601

で少なくともための100ナノ秒間隔の64ビット数を格納する構造体、FILETIMEを返し、GetSystemTimeAsFileTime()を呼び出すことですWindows NT 3.1,3.51、および4.01の時点では、GetSystemTimeAsFileTime() APIは、現在の時刻を取得できる最速のユーザーモードAPIでした。また、単一のAPI呼び出しであるという利点(GetSystemTime() - > SystemTimeToFileTime())と比較して、通常の状況では失敗することはありません。

は使用し、 FILETIME ft_now; ll_nowという名前の64ビット整数に変換するには、以下:
ll_now = (LONGLONG)ft_now.dwLowDateTime + ((LONGLONG)(ft_now.dwHighDateTime) << 32LL);

あなたはその後、ミリ秒(これらの10,000)で100ナノ秒間隔の数で割ると、あなたのことができますWin32エポックから数ミリ秒。

あなたは現在の日付にミリ秒数を見つけたいという願望を述べた1月1日、1970年

に到達するために116444736000000000LLを引き、Unixエポックに変換するには。 Win32エポックは真夜中に始まるので、今日までに経過したミリ秒数は、モジュラス演算を伴うファイル時間から計算できます。具体的には、24 hours/day * 60 minutes/hour * 60 seconds/minute * 1000 milliseconds/second = 86,400,000 milliseconds/dayがあるため、システム時間のモジュラスをミリ秒単位でユーザに入力することができます。86400000LL

異なるアプリケーションでは、モジュラスを使いたくないかもしれません。特に経過時間を計算している場合は、深夜のラップアラウンドが原因で問題が発生する可能性があります。これらの問題は解決できますが、私が知っている最も良い例は、リナックスカーネルのLinus Torvaldのラインです。

システム時刻は、UTC時刻として返されます(GetSystemTimeAsFileTime()の場合と単純にGetSystemTime()の両方の場合)。管理者が設定したローカル時間が必要な場合は、GetLocalTime()を使用できます。

+2

詳細については+1。 Windows NT 3.1,3.51、および4.01の最速のuser-api時にNT5.1 +のビットを追加するように注意してください。もはやそれはそれがもはや事実ではないことを意味するのだろうか? –

+1

それは、私が4.01以降の状況に誓うことができないことを暗に意味するだけですが、実際にはこのAPIはまだまだ最速です。昔は、いくつかのMOV操作として実装されていました.SystemTimeAsFileTimeは、すべてのプロセスが読む共有メモリページに格納されています。 –

+1

非常に良い、深い答えです。あなたの最後の質問に答えるために、私は環境のシナリオをシミュレートしています。日々進むにつれて、環境は暗くなります(屋外のように)。同期のために(自軍のエンジンが現在読んでいるフォーマットの真夜中からのミリ秒単位の)時刻を取得するのはちょっとしたことです:) – Mark

1

ここでは、Open Watcom Cプロジェクトで使用したWindowsで動作するコードをいくつか紹介します。これはCで動作するはずですが、++それは_dos_gettimeまたはgettimeを使用して秒(ないミリ秒単位)を返します

double seconds(void) 
    { 
    #ifdef __WATCOMC__ 
    struct dostime_t t; 
    _dos_gettime(&t); 
    return ((double)t.hour * 3600 + (double)t.minute * 60 + (double)t.second + (double)t.hsecond * 0.01); 
    #else 
    struct time t; 
    gettime(&t); 
    return ((double)t.ti_hour * 3600 + (double)t.ti_min * 60 + (double)t.ti_sec + (double)t.ti_hund * 0.01); 
    #endif 
} 
3

上記ジェドの答えのカット・ツー・チェイス例:

const std::string currentDateTime() { 

SYSTEMTIME st, lt; 

GetSystemTime(&st); 

char currentTime[84] = ""; 

sprintf(currentTime,"%d/%d/%d %d:%d:%d %d",st.wDay,st.wMonth,st.wYear, st.wHour, st.wMinute, st.wSecond , st.wMilliseconds); 

return string(currentTime); } 
+0

'sprintf(currentTime、"%.4d%.2d%.2d%.2d%.2d%.2d%.4d "、st.wYear、st.wMonth、st.wDay、st.wHour、st.wMinute、 st.wSecond、st.wMilliseconds); '固定長の文字列の場合 – Antonio

+0

これはUTC時間を取得します。 'GetLocalTime()'も同様に動作しますが、ローカルタイムゾーン時間を与えます –

関連する問題