C# Tips | 日付・時間処理:UnixTime変換

C# C#
スポンサーリンク

はじめに 「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 には、
ToUnixTimeSecondsToUnixTimeMilliseconds という、
まさにそのものズバリのメソッドが用意されています。


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# では、ToUnixTimeMillisecondsFromUnixTimeMilliseconds を使います。

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# コードの中で自然に扱えるようになります。

タイトルとURLをコピーしました