• 締切済み

Windowsの時刻について

私はプログラムの初心者です。 Windowsの正確な時刻をミリ秒レベルで取得するために”GetLocalTime”で取得しようと考えていたのですが、マイクロソフトのmsdnに システムが時刻を生成するのは毎秒 18 回です。したがって、Interval プロパティはミリ秒単位で設定されますが、間隔の真の精度は最大で 18 分の 1 秒です。 との記述があります。 上記であれば、約55.5ミリ秒毎にシステムの時刻を作成しているので、OSはどのようにして”GetLocalTime”で取得できるミリ秒の時間を作成しているのでしょうか。 実際に”GetLocalTime”で取得できるミリ秒での時刻の精度はどれ位なのでしょうか。 ”GetLocalTime”以外にOSの正確な時刻を取得する方法はあるのでしょうか。 宜しくお願い致します。

みんなの回答

  • matt99
  • ベストアンサー率0% (0/1)
回答No.4

私の記憶が確かなら、NT、2000、XPにおいてはCPUの種類、OS(Serverか否か)によってチックカウントがインクリメントされるタイミングが違うはず(10か15msec)です。 これらのOSでは一定タイミングごとにタイマー割り込みが発生しその際にOSが保持するチックカウントをインクリメントします。 GetTickCount()はこのチックカウントに先ほどのインクリメントタイミングを乗じたものが返されます。 GetLocalTime()はこれにOS起動時の時間を足したものが返されたと記憶しています。 リアルタイムOSではないので、いずれの関数を使用しても正確な時間を完全には取得することはできません。 確かに一定間隔で時間補正は行っていますが、そのずれが10msec以内になるようには補正してくれるわけではないです。かなりアバウトだったと思います。 この意味ではNTPで標準時刻と合っているOS時刻に合わせることは可能でしょうが、 NTPで標準時刻と合っているOS時刻自体が厳密な意味では正確ではないです。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

55.5msec単位に処理している以上、基本的には単純に55.5msecを加算していると思います。 これで数値的には.1msecの単位まで値はでますね。 もちろん、精度は55.5msecですが。 通常のWindowsで最も精度が高い時間計測の方法は QueryPerformanceCounter,QueryPerformanceFrequency を使うことです。(使えない場合がある) 但し、時刻ではありません。 OS自体、msec単位の高精度の時刻は提供していないでしょう。 また、Windowsは通常スレッドスイッチが10msec単位ですし、OSがリアルタイムOSでもありませんし、 高い精度での時間処理は非常に困難です。 初心者と自称される方には無理だろうと思います。

waiwaipapa
質問者

お礼

回答ありがとうございました。 msec単位の高精度の時刻は提供していないとのことで、時間計測等を駆使して頑張ってみたいと考えます。

  • wolfberry
  • ベストアンサー率23% (3/13)
回答No.2

完全な計時方法はありません。通常はGetLocalTimeを使用しますが、Win95で13mSec, Win98で5mSec, NTで10mSec程度の誤差が出ます。しかし、通常の用途ではこれで十分です。これ以上の精度が必要な場合、timeGetTimeやGetTickCountを使用する必要があります。それでも完全にはなりません。ラウンドロビン優先順位以上のリアルタイム優先順位にするとかドライバを作るとかすればもう少しましになると思いますが、OSは時計ではありません。

waiwaipapa
質問者

お礼

回答ありがとうございました。 ちなみに、今回作成しようとしていた内容は、自作のソフトに独自の時刻(標準時刻と一定時間ずらす目的)を持たせ、NTPで標準時刻と合っているOS時刻との時刻差を定周期に比較することで、自作ソフトの時刻の精度(10ms以内の誤差)を上げようと考えておりました。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.1

GetLocalTimeでの返却値は、 Windows98の時代は、毎秒18回でインクリメントされるカウンタを55.5倍して、OSを立ち上げた時刻を足して返していると思います。 WindowsXPはどうなっているか分かりません。

waiwaipapa
質問者

お礼

早急な回答ありがとうございました。 ちなみに今回対象としているOSはWindows2000ですが、このOSの場合はどうなるのでしょうか。

関連するQ&A

  • システムの時刻を利用しながら800ミリ秒毎のイベント発生

    現在For~Next文とSleep(700)を使用し、 イベントの処理時間を100ミリ秒と換算し、 2台のPCで同じコードを適用させ、 約800ミリ秒ごとにイベントを発生させております。 しかし、処理コード中にIf文やFor文も多数使用しているため、 取得条件の違いや、システムの負荷(?)、PCの性能(?)より遅延が発生していたり、 2台のPC間で一時間当たりの取得情報の量に違いがあることがわかりました。 2台のPCはNTPによる時刻同期により時刻のズレはないものとします。 はたして、システムから時刻を取得しつつ、 正確な800ミリ秒ごとのイベントを発生させる方法はあるのでしょうか。 面倒くさい質問で申し訳ありませんが、どうかよろしくお願いいたします。 現在のコードを以下に記します。 Sub ●約800ミリ秒ごとイベント発生プログラム●() Dim n As Long 'ループ用カウンタ Dim data As String For n = 1 To 26500 'ここから記録機能 Cells(n, "A") = Time Sleep (700) Calculate DoEvents '本当はここにイロイロなコードが入ります。 'ここに入るコードはスグに終わるときもあれば '80ミリ秒くらいかかるときもあります。 Next End Sub

  • ミリ秒単位の時間設定

    visual Basic6を使用してデータを0.5秒間隔で取得するプログラムを作っています。time関数のintervalを使うよりも正確な間隔でデータを取得したいと考えています。そこで、APIを使っての操作を調べ出したのですが、初心者なのでプログラムでの組み込み方がよくわかりません。教えてください。よろしくお願いします。

  • C++/CLIでの時間表示

    VC++2008のC++/CLIで時間の間隔を表示するプログラムを作成しています。 DateTime mySpan = DateTime::Parse(txtStartTime->Text); DateTime dtToday = DateTime::Now::get(); TimeSpan interval = dtToday - mySpan ; String^ strInterval = interval.ToString(); 上記のように,現在と時刻とtxtStartTime->textに表示されている時刻との差を取得しています。 この時, 秒単位の表示が出来ればいいのですが,strInterval の時刻が 00:01:05.12457895... のように不要な小数点まで表示されます。 どのようにすれば, 00:00:00 のような形式で表示できますでしょうか?

  • 時刻データが前後します

    VC++でログファイルを作成しており、ファイルには事象が発生した日付時刻を組み合わせて保存しています。通常であれば、発生した事象の並びに合わせて時刻も推移していますが、時々、後に発生した事象に対する時刻が、直前の事象に対する時刻より前の時刻が保存されてしまう現象が発生しています。(0.5~1秒強前後ですが。)OSはNT、2000系です。プログラム作成上で要注意項目等あれば教えていただけないでしょうか。  ※1:時間取得には「time()」を使用しています。  ※2:マルチスレッド上でのソフト作成を行っていますが、ログ保存処理には排他制御を施しているつもりです。 よろしくお願いします。

  • ms-dosコマンドで日付+時刻の名前でmkdir

    windows-xpに標準で入っているものだけで、 ms-dosコマンドで日付+時刻の名前でディレクトリを作成する事は可能でしょうか? 1ランでなくてバッチファイルでも構いません。 日付、時刻のフォーマットは問いませんが、「/」や「:」はOS的にダメです。 秒単位(または100分の1秒単位)は欲しいです。 「20090715120000」とかです。 mkdir 日時の取得 あるいは SET DIR_DT=日時の取得 mkdir %DIR_DT% の日時の取得の箇所が知りたいです。

  • 現在時刻をミリ秒まで取得

    お疲れ様です 現在時刻をミリ秒まで取得がしたいです。 今はtime_tを使って秒までは取得したのですがミリ秒は構造体にないらしく同じようにとってはこれないのでしょうか? また別のやり方だとどんなのがあるか教えてください。 現在は下記のように取得してyyyymmddhhmmssの形を作ってます。 これをyyyymmddhhmmsssssのようにミリ秒を増やしたたいのです。 長くなってしまいましたがよろしくお願いします time_t timer; time(&timer);/* 現在の時刻を取得 */ struct tm *local; local =localtime(&timer);/* 地方時の構造体に変換 */ CString time; //CString用の時間 time.Format("%4d%02d%02d%02d%02d%02d" ,local->tm_year + 1900,/* 年 */ local->tm_mon+1,/*月は0から始まるので1を+*/ local->tm_mday,/* 日 */ local->tm_hour,/* 時 */ local->tm_min,/* 分 */ local->tm_sec);/* 秒 */

  • ntpによる時刻補正の時間当たりの時刻補正率が調べられません

    Solarisを使用しています。xntpdデーモンを使用してntpサーバよりシステム時刻の時刻補正を行っています。 時刻補正の際、システム時計がntpサーバとの時刻が大きくずれていた場合、xntpdデーモンは 一気に補正を行わず、時間をかけて徐々にntpサーバの時刻に合わせるそうです。 たとえばシステム時計が5秒進んでいた場合、システム時計は秒針を1-5/1000[秒]ずつ進めれば、 200秒後に補正完了となります。 ここで、この補正率がどのように与えられているか知る必要があるのですが、manページ (dateなど他コマンドのmanも)やホームページで調べても具体的な補正率の値についてどこにも載っていません。 どなたかご存知の方、ご教授をお願いいたします。Solaris以外のOSについてでもかまいません。

  • Windows7とWindowsNTの時刻同期

    VMware Player(Ver.6)にゲストOSとして構築したWindowsNT(4.0)の時刻と、ホストOSであるWindows7(Professional)の時刻を同期させたいと思っています。 VMware Toolsの時刻同期機能で、Windows7側の時刻を変更した場合、WindowsNT側の時刻が同期しますが、逆にWindowsNT側の時計を変更した場合、Windows7側の時刻が同期しません。 これを解決するための何か良い方法は無いでしょうか? (できれば設定のみでシンプルに実現できればベストです。) ちなみに、Windows7側のコマンドプロンプトで「net time \\(WindowsNT側のIP) /set /y」を実行してみましたが、「サービスが開始していません。」と出て失敗しました。 これができるのであれば、Windows7側でこのコマンドを実行するアプリを作成すれば済むのですが・・・ 最悪、Windows7側とWindowsNT側で通信するアプリを作成し、WindowsNT側で取得した時刻をWindows7側へ送り、Windows7側で受信した時刻を設定する、という方法も考えていますが、諸事情があり、できるだけWindowsNT側には新しいアプリを入れたくありません。 NTPやSNTPについてはあまり詳しくないのですが、その辺りをうまく活用すれば、もっとシンプルに解決できそうでしょうか?

  • 現在時刻から指定時刻までの時間差分を計算

    setInterval(next, 1000); //1:30後の時刻取得 function get_next(){  nextTime = new Date();  nextTime.setTime(nextTime.getTime() + 90*60*1000); } function next(){  nowTime = new Date();  outputTime = nextTime.getTime() - nowTime.getTime();  getElementById('output').innerHTML = outputTime; } これで1時間30分後までの時間差分をミリ秒で取得は出来てるんですが これを1秒ごとに実行して これをx時間x分x秒後 という感じに表示させたいのですが何か良い方法はありませんか?

  • GPS電波時計の時刻受信について

    シチズンの電波時計サテライトウェイブF900のうるう秒の補正についての質問です。 シチズンの簡易説明にGPSからの時刻受信と、うるう秒の受信方法について書かれていました。 GPSの時刻(原子時)は世界時と19秒ずれていて、その調整の為だと思うのですが・・・。 であればそもそも手動で時刻の情報を取得した場合、正確な時間を得るにはその都度うるう秒の受信も行わなければいけないのでしょうか? また毎午前2時に自動で電波を受信し時刻を調整しているとの事ですが、GPS電波時計一般にこの時は上記のような調整が自動で行われているのでしょうか? 詳しい方がおられれば教えて頂ければありがたいです。

専門家に質問してみよう