はじめに 「UnixTime変換」は“異世界の時計との変換アダプタ”
API やログ、JavaScript、Linux 系ツールと連携するときに、
よく出てくるのが「UnixTime(UNIX時間)」です。
1707657600
1707657600000
こんな「よく分からないでかい整数」が飛び交っていたら、それはだいたい UnixTime です。
C# では、この UnixTime と DateTime / DateTimeOffset を相互に変換することで、
「人間に分かる日時」と「システムが好む秒数・ミリ秒数」を行き来できます。
ここでは、
UnixTime の正体 → 秒版とミリ秒版 → C# での変換方法 → 実務でのユーティリティ化
という流れで、初心者向けにかみ砕いて説明していきます。
UnixTimeとは何かをざっくり押さえる
UnixTime の定義
UnixTime(UNIX時間)は、
「1970年1月1日 00:00:00(UTC)」からの経過時間を、
秒またはミリ秒で表した数値です。
例えば、
1970/01/01 00:00:00 UTC → 0
1970/01/01 00:00:01 UTC → 1
1970/01/01 00:01:00 UTC → 60
という感じです。
ここで重要なのは、
UnixTime は「必ず UTC 基準」である、ということです。
日本時間やローカル時間ではなく、「世界共通の基準時間」からの秒数です。
C#での基本:DateTimeOffset を使うと楽になる
なぜ DateTimeOffset が向いているのか
DateTime でも変換はできますが、
UnixTime は「UTC基準の絶対的な時間」を表すので、
「オフセット付きの日時」を扱える DateTimeOffset のほうが相性が良いです。
DateTimeOffset には、ToUnixTimeSeconds と ToUnixTimeMilliseconds という、
まさにそのものズバリのメソッドが用意されています。
DateTimeOffset → UnixTime(秒)への変換
秒単位の UnixTime を取得する
まずは一番よく使う「秒版」の変換です。
using System;
DateTimeOffset nowUtc = DateTimeOffset.UtcNow;
long unixSeconds = nowUtc.ToUnixTimeSeconds();
Console.WriteLine(nowUtc); // 2026/02/11 0:00:00 +00:00 など
Console.WriteLine(unixSeconds); // 例えば 1760140800 のような値
C#UtcNow を使っているので、
「今この瞬間の UTC 時刻」を基準に UnixTime を出しています。
日本時間から変換したい場合も、
内部的には UTC に変換されてから UnixTime になります。
DateTimeOffset nowJst = DateTimeOffset.Now; // +09:00 が付いた日時
long unixSeconds = nowJst.ToUnixTimeSeconds();
Console.WriteLine(nowJst); // 2026/02/11 9:00:00 +09:00 など
Console.WriteLine(unixSeconds); // 中身は UTC 基準の秒数
C#ここでの重要ポイントは、
「どのタイムゾーンの日時であっても、UnixTime にするときは UTC に正規化される」
ということです。
UnixTime(秒) → DateTimeOffset への変換
秒から人間に読める日時へ戻す
今度は逆に、UnixTime から日時に戻してみます。
using System;
long unixSeconds = 1760140800; // 例
DateTimeOffset dtoUtc = DateTimeOffset.FromUnixTimeSeconds(unixSeconds);
Console.WriteLine(dtoUtc); // 2026/02/11 0:00:00 +00:00
Console.WriteLine(dtoUtc.LocalDateTime); // 実行環境のローカル時間に変換した日時
C#FromUnixTimeSeconds は、
「UTC の DateTimeOffset」として値を返します。
日本時間として見たい場合は、TimeZoneInfo を使って変換します。
TimeZoneInfo jst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime jstTime = TimeZoneInfo.ConvertTime(dtoUtc, jst).DateTime;
Console.WriteLine(jstTime); // 2026/02/11 9:00:00 など
C#UnixTime はあくまで UTC 基準なので、
「どのタイムゾーンで表示するか」は別途決める必要があります。
ミリ秒版 UnixTime の扱い
JavaScript や一部APIでよく出てくる「ミリ秒版」
ブラウザの JavaScript(Date.now())や、
一部の Web API では「1970年からのミリ秒」を使うことがあります。
C# では、ToUnixTimeMilliseconds と FromUnixTimeMilliseconds を使います。
using System;
DateTimeOffset nowUtc = DateTimeOffset.UtcNow;
long unixMillis = nowUtc.ToUnixTimeMilliseconds();
Console.WriteLine(unixMillis); // 例えば 1760140800123 のような値
C#逆変換はこうです。
long unixMillis = 1760140800123;
DateTimeOffset dtoUtc = DateTimeOffset.FromUnixTimeMilliseconds(unixMillis);
Console.WriteLine(dtoUtc); // 2026/02/11 0:00:00.123 +00:00 など
C#秒版とミリ秒版を混同すると、
「値が1000倍違う」「1970年付近の変な日時になる」といった事故が起きます。
実務では、
「このAPIは秒か?ミリ秒か?」を仕様で必ず確認し、
ユーティリティメソッド名にも Seconds / Milliseconds を明示しておくと安全です。
DateTime と UnixTime を直接変換したい場合
UTC の DateTime を前提にする
どうしても DateTime で扱いたい場合は、
「UTC の DateTime を前提にする」ことが重要です。
using System;
public static class UnixTimeUtil
{
private static readonly DateTime UnixEpoch =
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long ToUnixTimeSeconds(DateTime utc)
{
if (utc.Kind != DateTimeKind.Utc)
{
utc = DateTime.SpecifyKind(utc, DateTimeKind.Utc);
}
return (long)(utc - UnixEpoch).TotalSeconds;
}
public static DateTime FromUnixTimeSeconds(long unixSeconds)
{
return UnixEpoch.AddSeconds(unixSeconds);
}
}
C#使い方の例です。
DateTime utcNow = DateTime.UtcNow;
long unix = UnixTimeUtil.ToUnixTimeSeconds(utcNow);
DateTime back = UnixTimeUtil.FromUnixTimeSeconds(unix);
Console.WriteLine(utcNow);
Console.WriteLine(unix);
Console.WriteLine(back);
C#ここでの重要ポイントは、
「UnixEpoch を UTC として定義し、引数も UTC として扱う」
という前提を崩さないことです。
ローカル時間の DateTime.Now をそのまま渡すと、
環境によってズレが出るので注意が必要です。
実務で使える UnixTime ユーティリティの形
「UTC保存・UnixTime連携」を前提にしたユーティリティ
API やメッセージキューなどで UnixTime をやり取りし、
DB では UTC の日時を使う、という構成を想定したユーティリティ例です。
using System;
public static class UnixTimeHelper
{
public static long UtcDateTimeToUnixSeconds(DateTime utc)
{
return new DateTimeOffset(utc.ToUniversalTime()).ToUnixTimeSeconds();
}
public static DateTime UnixSecondsToUtcDateTime(long unixSeconds)
{
return DateTimeOffset.FromUnixTimeSeconds(unixSeconds).UtcDateTime;
}
public static long UtcDateTimeToUnixMilliseconds(DateTime utc)
{
return new DateTimeOffset(utc.ToUniversalTime()).ToUnixTimeMilliseconds();
}
public static DateTime UnixMillisecondsToUtcDateTime(long unixMilliseconds)
{
return DateTimeOffset.FromUnixTimeMilliseconds(unixMilliseconds).UtcDateTime;
}
}
C#使い方のイメージです。
DateTime utcNow = DateTime.UtcNow;
long unixSec = UnixTimeHelper.UtcDateTimeToUnixSeconds(utcNow);
long unixMs = UnixTimeHelper.UtcDateTimeToUnixMilliseconds(utcNow);
DateTime backSec = UnixTimeHelper.UnixSecondsToUtcDateTime(unixSec);
DateTime backMs = UnixTimeHelper.UnixMillisecondsToUtcDateTime(unixMs);
Console.WriteLine(unixSec);
Console.WriteLine(unixMs);
Console.WriteLine(backSec);
Console.WriteLine(backMs);
C#ここでのポイントは、
「メソッド名に UTC / Seconds / Milliseconds を全部入れて、意味を曖昧にしない」
という設計です。
まとめ 「UnixTime変換ユーティリティ」は“UTCの世界と人間の時間をつなぐ橋”
UnixTime変換は、
API・ログ・他言語との連携でほぼ必ず出てくるテーマです。
押さえておきたいポイントを整理すると、こうなります。
UnixTime は「1970/01/01 00:00:00 UTC からの経過時間」であり、秒版とミリ秒版がある。
C# では DateTimeOffset.ToUnixTimeSeconds / FromUnixTimeSeconds(および Milliseconds 版)を使うのが最も素直で安全。
UnixTime は必ず UTC 基準なので、「どのタイムゾーンで表示するか」は別途 TimeZoneInfo などで変換する。
秒とミリ秒を混同すると致命的にズレるので、メソッド名や変数名に Seconds / Milliseconds を必ず含める。DateTime で扱う場合は「UTC前提」にし、DateTimeKind を意識してズレを防ぐ。
ここを押さえておけば、
「よく分からない巨大な整数」に見えていた UnixTime が、
“UTCの世界と人間の時間をつなぐ、実務で使える共通フォーマット”として
自分の C# コードの中で自然に扱えるようになります。
