C#でタイムスタンプの精度を上げるためのテクニックを徹底解説!(初心者向け)
生徒
「プログラムで時間を扱うときに、もっと細かい時間を記録したいです。どうすれば秒より細かくできますか?」
先生
「C#では、タイムスタンプの精度を上げるための方法がいくつかあります。状況に応じて選ぶことで、より正確な時間記録ができますよ。」
生徒
「普通のDateTime型だと精度に限界があると聞いたことがあります。本当ですか?」
先生
「確かにDateTimeはナノ秒の精度まで扱うことができません。そのため、別の方法を使う必要があります。それでは詳しく説明していきましょう。」
1. タイムスタンプとは何か?
タイムスタンプとは、ある出来事が起きた時間を正確に記録するための値のことです。例えば、アプリケーションのログ記録、ファイルの保存時間、ネットワーク通信での送受信時間などに使われます。多くの初心者がまず利用するのはC#のDateTime型ですが、標準のDateTime.Nowでは秒より細かい時間を完全には表現できず、ミリ秒以下の精度が必要な場合には不向きです。
特に、高速な処理が行われる環境や、正確な時間差を記録する必要があるゲーム開発、金融システム、ネットワーク通信などでは、もっと精密なタイムスタンプが求められます。
2. DateTime.Now の限界と精度の仕組み
C#で一般的に使われるDateTime.Nowは、OSのシステムクロックから時間を取得しています。しかし、これは最大で約15〜16ミリ秒程度の誤差が発生する可能性があります。「ミリ秒(ms)」は千分の一秒の単位で、より細かい精度が必要な場合には物足りません。
より正確な値が必要なときにはDateTime.UtcNowを使う選択肢もありますが、こちらも根本的な精度には大きな差がありません。
3. 高精度の時間取得には Stopwatch を使う
Stopwatchクラスは、非常に正確な時間を計測できる機能を提供します。これはパソコン内部の高精度タイマーを使用しており、ナノ秒に近い時間を扱うことができます。ミリ秒よりさらに細かい時間差を知りたい場合に便利です。
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
var x = i * 10;
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
}
}
ElapsedTicksは内部時計の単位で、これを使うことで処理時間をより正確に把握できます。簡単に言うと、ストップウォッチを持って計測するイメージです。
4. 高精度タイムスタンプの保存には ticks が便利
C#のDateTimeには「ticks(ティック)」という単位があり、100ナノ秒ごとにカウントされる非常に小さな時間単位です。1秒は10,000,000 ticksで構成されています。
long ticks = DateTime.UtcNow.Ticks;
Console.WriteLine(ticks);
638667421243567890
この数字自体はとても大きいですが、処理の前後で差を取ることで正確な時間差を算出できます。
5. StopwatchとDateTimeを組み合わせて高精度を実現する
リアルタイムの時刻と正確な時間差の両方が必要な場合には、StopwatchとDateTimeを組み合わせる方法が効果的です。例えば、ログの記録時刻を正確に合わせることができます。
DateTime startTime = DateTime.UtcNow;
Stopwatch sw = Stopwatch.StartNew();
sw.Stop();
Console.WriteLine($"開始時間: {startTime:yyyy/MM/dd HH:mm:ss.fff}");
Console.WriteLine($"経過時間: {sw.Elapsed.TotalMilliseconds} ms");
6. 記録を文字列形式で扱うときのポイント
ログとして保存する場合、ToString("yyyy-MM-dd HH:mm:ss.fffffff")のように書式指定することで、ナノ秒に近い精度まで文字列化できます。
Console.WriteLine(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
2025-11-27 00:30:10.1234567
末尾の「f」の数が多いほど細かい数字まで表示できます。