.NET Ticks → Unix タイムスタンプ コンバーター
.NET Ticks を Unix 時間に変換します。正確な式と大きな値への対応。出力は秒、ミリ秒、ISO 8601、可読形式。
0001-01-01 からの 100 ナノ秒間隔
現在の時刻 — .NET DateTime.Ticks—
Unix タイムスタンプ(秒)—
.NET のティックとは?
.NET では、DateTime.Ticks と TimeSpan.Ticks が時間を 100 ナノ秒単位で測ります。DateTime のティック数は、先発グレゴリオ暦の 0001 年 1 月 1 日 00:00:00 からの 100 ナノ秒間隔の数です。
- エポック:0001-01-01 00:00:00
- 分解能:100 ナノ秒刻み(毎秒 10,000,000)
- 現在の値はおよそ 6.4 × 10^17
- C#: DateTime.UtcNow.Ticks, DateTimeOffset.UtcNow.Ticks
.NET のティックを Unix タイムスタンプに変換する方法
0001-01-01 と 1970-01-01 の間には 62,135,596,800 秒あります。ティックを 10,000,000 で割って西暦 1 年からの秒を求め、そのオフセットを引きます。
- Unix seconds = Ticks / 10000000 − 62135596800
- Unix milliseconds = Ticks / 10000 − 62135596800000
- 例:638355968000000000 → 1700000000 → 2023-11-14 22:13:20 UTC
- C# では:new DateTimeOffset(dt).ToUnixTimeSeconds() がこれを行う
C# コードとエッジケース
最新の .NET は DateTimeOffset.ToUnixTimeSeconds() と ToUnixTimeMilliseconds()、逆方向の DateTimeOffset.FromUnixTimeSeconds() を提供します。ティックを直接使うのは、シリアライズされたデータと相互運用するときだけにしてください。DateTime.Ticks は DateTimeKind を無視するため、常にまず UTC に正規化してください。
- C#: var unixSeconds = new DateTimeOffset(dt.ToUniversalTime()).ToUnixTimeSeconds();
- C#: var dt = DateTimeOffset.FromUnixTimeMilliseconds(ms).UtcDateTime;
- ティック 0 = 0001-01-01;DateTime.MaxValue.Ticks = 3155378975999999999
- 値は JavaScript の安全な整数を超えるため、このコンバーターは BigInt を使う
関連するタイムスタンプ形式コンバーター
ライブラリとシリアライズに関する注意
ティックは古い .NET のシリアライズ形式や JSON の慣習に現れます。次に注意:
- レガシーな Microsoft JSON 日付:"/Date(1700000000000+0000)/" はミリ秒を包む(ティックではない)
- DateTimeOffset.UnixEpoch は最新の .NET における標準のゼロ点
- DateTime.MaxValue.Ticks = 3155378975999999999;これほど高い値はほぼ確実に「なし」のセンチネルを示す
- TimeSpan.Ticks は同じ単位だが期間として測られる;DateTime のティックから TimeSpan のティックを安易に引かないこと
- Newtonsoft.Json と System.Text.Json はどちらも既定で ISO 8601 を使う — 選べるなら生のティックよりこちらを優先する
FAQ
- 1 秒は何ティックか?
- ちょうど 10,000,000 ティック — 各ティックは 100 ナノ秒です。
- .NET ティックと Windows FILETIME の違いは?
- どちらも 100 ナノ秒単位を使いますが、.NET ティックは 0001-01-01 から数え、FILETIME は 1601-01-01 から数えます。両者は 504,911,232,000,000,000 ティックの固定オフセットだけ異なります。
- C# の DateTime から Unix 時間を得るには?
- new DateTimeOffset(dateTime.ToUniversalTime()).ToUnixTimeSeconds() または .ToUnixTimeMilliseconds() を使います。