C# .NET8でDateTimeを日本時間でISO 8601形式に変換する方法

【C#/.NET 8対応】DateTimeを日本時間でISO 8601形式に変換する方法【和暦対策・URLエンコードも解説】

2025年7月31日

✅この記事でわかること

🔍 はじめに:DateTimeを「yyyy-MM-ddTHH:mm:ss.fff+09:00」の形式で扱いたい

C#でWeb APIやログ出力を行う際、ISO 8601形式のタイムスタンプが必要になることが多くあります。特に日本時間(JST)を明示的に含める場合は以下のようなフォーマットが一般的です。

2025-06-09T15:30:45.123+09:00

.NETのDateTimeDateTimeOffsetを使ってこの形式に変換する際、和暦設定による「令和07年」問題や、URLへの安全な埋め込み(エンコード)などに注意が必要です。

✅ DateTimeをJST + ISO8601形式でフォーマットする

まずは日本時間(UTC+9)を明示的に扱う方法です。

using System;

DateTime localDateTime = DateTime.Now;
var jstOffset = new TimeSpan(9, 0, 0);
var jstDateTime = new DateTimeOffset(localDateTime, jstOffset);

string formatted = jstDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffzzz");
Console.WriteLine(formatted);

出力例:

2025-06-09T15:30:45.123+09:00

ここで zzz はタイムゾーンの +09:00 を表します。

⚠️ 和暦設定だと「yyyy」が令和年になる問題

日本語Windowsではロケール設定がja-JP(日本語)かつ和暦が有効になっている場合、yyyy が「令和07年」など和暦表示になります。

🔧 回避方法①:InvariantCulture を指定して西暦強制

using System.Globalization;

string formatted = jstDateTime.ToString(
    "yyyy-MM-dd'T'HH:mm:ss.fffzzz",
    CultureInfo.InvariantCulture
);

🔧 回避方法②:ja-JPのまま西暦カレンダーを指定

var jaCulture = new CultureInfo("ja-JP");
jaCulture.DateTimeFormat.Calendar = new GregorianCalendar();

string formatted = jstDateTime.ToString(
    "yyyy-MM-dd'T'HH:mm:ss.fffzzz",
    jaCulture
);

🌐 URLクエリパラメータに日時を安全に含める方法(エンコード)

ISO8601形式の日時には /, : などのURL予約文字が含まれています。そのままGETリクエストのクエリに含めると、正しく解析されません。

✅ 解決方法:URLエンコード(パーセントエンコーディング)

using System.Net;

string dateString = "2025-06-09T15:30:45.123+09:00";
string encoded = WebUtility.UrlEncode(dateString);

string url = $"https://example.com/api?datetime={encoded}";
Console.WriteLine(url);

出力:

https://example.com/api?datetime=2025-06-09T15%3A30%3A45.123%2B09%3A00

🔚 まとめ:.NETでのDateTime処理は文化設定とURLに注意

項目 解説
JST指定 DateTimeOffsetでUTC+09:00を明示
和暦回避 InvariantCultureまたは西暦カレンダーを指定
ISO 8601形式 "yyyy-MM-ddTHH:mm:ss.fffzzz" フォーマット
URLクエリパラメータ対応 WebUtility.UrlEncodeを使う

DateTimeをISO準拠で日本時間として安全に扱うには、カルチャ設定とURLエンコードの正しい理解が重要です。

WinUI 3 / XAML の Grid.Width 設定方法

WinUI 3でMenuFlyoutをShowAtで表示する方法【コード付き解説】

MenuFlyoutWinUI 3 で便利なポップアップメニュー

WinUI 3の開発で混乱しがちな「空白のウィンドウ」と「空白のページ」の違い

PowerShellでMSIXアプリ(Storeアプリ)を起動する方法|AppUserModelIdとURIスキーム活用術

Microsoft Storeアプリ更新時のロールアウト設定まとめ

PowerShellでtail -f!WindowsでUTF-8対応のリアルタイムログ監視を実現する方法

Microsoft純正の新しいコンソールエディタ「edit」が復活!| edit.exe インストール方法

Microsoft Authenticatorのオートフィル機能が2025年7月に終了

RuntimeBroker.exeとMsEdgeWebView2.exeとは?Windows 11のプロセスについて

PowerShellでGrapheme Clusterについて処理を考える

業務用ノートパソコンのストレージは暗号化されている?BitLockerの確認と対策方法

【Windows】Volta コマンドライン インストール | Node.jsをバージョン管理する方法

【C# .NET 8 対応】List<string> を重複なしでマージする方法|

【C#】大容量ファイルを指定サイズ以下に分割する方法|.NET8対応コード付き

【C# .NET 8】ファイルから重複行を削除する2つの方法|Distinct vs HashSet

【C#】.emlファイルの本文を読みやすく抽出する方法

WinUI 3 ComboBoxの自作クラスバインドと選択イベント検出方法

switch文でオブジェクトの型を判別する方法

【WPF】Task.Run中にUIを更新する方法

System.Text.Json 9.0.0.0 で FileNotFoundException

C#で改行・カンマ入りのCSVを正しく読み込む方法【.NET8対応】

C#/.NET 8でDateTimeを日本時間でISO 8601形式に変換する方法

【Anker Soundcore Liberty 4】イヤーピース紛失!代替品はAmazonで購入

和暦設定でも安心!C#でISO 8601やカスタム日時文字列を確実にDateTimeに変換