カテゴリ: C# 更新日: 2026/07/19

C#で日時をJSONにシリアライズするフォーマット指定を完全解説!初心者向けガイド

C#で日時をJSONにシリアライズする際のフォーマット指定
C#で日時をJSONにシリアライズする際のフォーマット指定

先生と生徒の会話形式で理解しよう

生徒

「C#で日時をJSONに変換するとき、変な形式で出力されてしまうことがあります。好きな形に変更する方法はありますか?」

先生

「はい、C#では日時をシリアライズするときにフォーマットを自由に指定できます。設定次第で見やすく、扱いやすい形に整えることができます。」

生徒

「どうやって指定すればいいんですか?難しい設定が必要なんでしょうか?」

先生

「実はとても簡単です。これから、基本的な方法を順番に説明していきます。」

1. C#で日時をJSONにシリアライズするとどうなる?

1. C#で日時をJSONにシリアライズするとどうなる?
1. C#で日時をJSONにシリアライズするとどうなる?

C#で日時(DateTime)をJSONに変換するとき、特に設定をしないままだと、標準の形式で出力されます。標準形式では、「UNIX時間」や「ISO 8601形式」など、人間には読みづらい形で表現されることがあります。

例えば、システムの既定形式では次のような出力になり、初めて見ると意味が分かりづらいかもしれません。


2025-12-01T10:30:00.000Z

これは国際標準のISO 8601形式で、「T」は日時の区切り、「Z」は世界標準時(UTC)を表しています。初心者にとっては読み解きにくいため、自由にフォーマットを指定する方法を知ることはとても重要です。

2. 日時フォーマットを指定してJSONにシリアライズする方法

2. 日時フォーマットを指定してJSONにシリアライズする方法
2. 日時フォーマットを指定してJSONにシリアライズする方法

C#では、JSONのシリアライズに使われるライブラリとして主に以下があります。

  • System.Text.Json(.NET標準)
  • Newtonsoft.Json(広く利用されているライブラリ)

ここでは、実務でもよく使われるNewtonsoft.Jsonを例に日時フォーマットを指定する方法を説明します。


using Newtonsoft.Json;
using System;

public class Sample
{
    public DateTime CreatedAt { get; set; }
}

var sample = new Sample
{
    CreatedAt = new DateTime(2025, 12, 1, 10, 30, 0)
};

var settings = new JsonSerializerSettings
{
    DateFormatString = "yyyy/MM/dd HH:mm:ss"
};

string json = JsonConvert.SerializeObject(sample, settings);
Console.WriteLine(json);

この例では、yyyy/MM/dd HH:mm:ssという形式で出力されます。これは、「西暦4桁/月2桁/日2桁 時:分:秒」の順番で読みやすい形になります。


{"CreatedAt":"2025/12/01 10:30:00"}

3. System.Text.Jsonでフォーマット指定する方法

3. System.Text.Jsonでフォーマット指定する方法
3. System.Text.Jsonでフォーマット指定する方法

最近のC#では、標準のSystem.Text.Jsonもよく使われます。この場合はカスタムコンバータを使う必要があります。


using System;
using System.Text.Json;
using System.Text.Json.Serialization;

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
        => DateTime.Parse(reader.GetString());

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        => writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
}

var options = new JsonSerializerOptions
{
    Converters = { new DateTimeConverter() }
};

var obj = new { Time = DateTime.Now };
string json = JsonSerializer.Serialize(obj, options);
Console.WriteLine(json);

{"Time":"2025-12-01 10:30:00"}

このように、ライブラリによって設定方法は異なりますが、目的は日時を読みやすく整えることです。

4. 日時フォーマットの主な例一覧

4. 日時フォーマットの主な例一覧
4. 日時フォーマットの主な例一覧

格式は自由に変えられます。よく使われる形式をまとめました。

  • yyyy-MM-dd:2025-12-01
  • HH:mm:ss:10:30:00
  • yyyy-MM-ddTHH:mm:ssZ:ISO 8601形式(国際標準)
  • yyyy/MM/dd HH:mm:ss:日本で一般的な形式

目的に応じて使い分けられるようになると、JSONデータの管理が格段に楽になります。

5. UTCとローカル時間の違いに注意する

5. UTCとローカル時間の違いに注意する
5. UTCとローカル時間の違いに注意する

日時をJSONにシリアライズする際に非常に重要なのが、UTC(協定世界時)とローカル時間の違いです。先ほど紹介したISO 8601形式の「Z」はUTCを意味しており、日本時間とは9時間の差があります。

例えば、次のようなJSONがあった場合を見てみましょう。


2025-12-01T10:30:00Z

これはUTCの10時30分を意味するため、日本時間では19時30分になります。この違いを理解していないと、表示される時間がずれてしまう原因になります。

C#では、DateTimeKindを指定することで、UTCかローカルかを明確に扱うことができます。


DateTime utcTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc);
Console.WriteLine(utcTime);

2025/12/01 10:30:00

実務では、API通信ではUTC、画面表示ではローカル時間といった使い分けが一般的です。JSONで日時を扱う場合は、この違いを意識することが重要です。

6. DateTimeOffsetを使った安全な日時管理

6. DateTimeOffsetを使った安全な日時管理
6. DateTimeOffsetを使った安全な日時管理

DateTimeは便利ですが、タイムゾーンの扱いが曖昧になることがあります。そのため、より安全に日時を扱いたい場合はDateTimeOffsetを使うのがおすすめです。

DateTimeOffsetは、日時に加えて時差情報(オフセット)を持っているため、異なる地域間でも正確な時間を管理できます。


using System;
using System.Text.Json;

var obj = new
{
    Time = DateTimeOffset.Now
};

string json = JsonSerializer.Serialize(obj);
Console.WriteLine(json);

{"Time":"2025-12-01T10:30:00+09:00"}

このように「+09:00」のような形式で時差が含まれるため、データのやり取りでもズレが発生しにくくなります。特に海外システムと連携する場合には、DateTimeOffsetの使用が推奨されます

7. JSONのデシリアライズ時のフォーマット対応

7. JSONのデシリアライズ時のフォーマット対応
7. JSONのデシリアライズ時のフォーマット対応

JSONに保存された日時を読み込む際にも、フォーマットに注意が必要です。シリアライズ時と異なる形式だと、正しくデータが変換できない場合があります。

例えば、カスタムフォーマットを使っている場合は、読み込み時にも同じルールを適用する必要があります。


using Newtonsoft.Json;
using System;

string json = "{\"CreatedAt\":\"2025/12/01 10:30:00\"}";

var settings = new JsonSerializerSettings
{
    DateFormatString = "yyyy/MM/dd HH:mm:ss"
};

var obj = JsonConvert.DeserializeObject<Sample>(json, settings);
Console.WriteLine(obj.CreatedAt);

2025/12/01 10:30:00

フォーマットが一致していないと例外が発生したり、意図しない値になる可能性があります。そのため、シリアライズとデシリアライズで同じフォーマットを統一することが大切です。

また、例外対策としてtry-catchを使い、エラー時の処理をしっかり実装しておくと、実務でも安心して利用できます。

まとめ

まとめ
まとめ

C#における日時のJSONシリアライズ処理は、システム開発において避けては通れない非常に重要なテーマです。デフォルトの状態では、私たちが普段目にしている「2026年1月31日」といった形式ではなく、ISO 8601形式などの機械的な文字列として出力されてしまいます。これを放置すると、外部APIとの連携時にエラーが発生したり、フロントエンド側での日付処理が複雑になったりと、予期せぬトラブルを招く原因になりかねません。

開発現場で役立つ実践的なテクニック

これまでに紹介した通り、Newtonsoft.JsonSystem.Text.Jsonといった主要なライブラリを使用することで、日付フォーマットの制御は驚くほど柔軟に行えます。特に、日本国内向けの業務システムであれば「yyyy/MM/dd HH:mm:ss」といった形式が好まれますし、グローバルなサービスであればミリ秒まで含めたUTC表記が求められることもあります。

また、シリアライズだけでなく「デシリアライズ(JSONからオブジェクトへの復元)」の際も、フォーマットが一致していないと解析に失敗します。一貫性のある設定をプロジェクト全体に適用することが、保守性の高いコードを書くための第一歩と言えるでしょう。

C#での応用的なサンプルプログラム

さらに理解を深めるために、複数の日付プロパティを持つクラスをシリアライズする実戦的なコードを見てみましょう。ここでは、Newtonsoft.Jsonを使用して、プロパティごとに異なるフォーマットを適用する手法も交えて紹介します。


using System;
using Newtonsoft.Json;
using System.Collections.Generic;

public class InventoryReport
{
    public string ItemName { get; set; }

    // プロパティ単位でフォーマットを指定することも可能
    [JsonProperty("inspection_date")]
    [JsonConverter(typeof(Newtonsoft.Json.Converters.IsoDateTimeConverter), "yyyy-MM-dd")]
    public DateTime InspectionDate { get; set; }

    public DateTime UpdatedAt { get; set; }
}

public class Program
{
    public static void Main()
    {
        var report = new InventoryReport
        {
            ItemName = "サーバー機器",
            InspectionDate = new DateTime(2026, 1, 31),
            UpdatedAt = DateTime.Now
        };

        // グローバルな設定
        var settings = new JsonSerializerSettings
        {
            DateFormatString = "yyyy/MM/dd HH:mm:ss",
            Formatting = Formatting.Indented // 見やすく整形
        };

        string jsonOutput = JsonConvert.SerializeObject(report, settings);
        Console.WriteLine(jsonOutput);
    }
}

上記のコードを実行すると、次のようなJSONが出力されます。


{
  "ItemName": "サーバー機器",
  "inspection_date": "2026-01-31",
  "UpdatedAt": "2026/01/31 10:45:22"
}

他言語との連携:COBOLでの日付処理について

エンタープライズな開発現場では、C#で作成したWeb APIが、メインフレーム上のCOBOLプログラムとデータをやり取りするケースも珍しくありません。COBOLでは日付を文字列や数値として扱うのが一般的ですが、現代的なCOBOL(Enterprise COBOLなど)では、JSON生成をサポートする構文も存在します。

C#側でフォーマットを整えておくことは、こうしたレガシーシステムや異なる言語環境とのデータ交換をスムーズにするための「思いやり」でもあります。例えば、COBOL側で扱いやすい「YYYYMMDD」形式でJSONを出力する場合、C#では DateFormatString = "yyyyMMdd" と設定するだけで対応可能です。

SEOを意識した日付操作のポイント

Web開発において、JSONに含まれる日付データそのものが直接検索エンジンにインデックスされることは稀ですが、構造化データ(JSON-LD)として出力する場合は話が別です。Googleなどの検索エンジンが正しく日付を認識するためには、シリアライズ時に正しい形式で出力されている必要があります。 「C# JSON 日付 変換」や「System.Text.Json フォーマット指定」といったキーワードで検索する開発者が求めているのは、単なるコードの書き方だけではありません。その設定がシステム全体にどのような影響を及ぼすかという「納得感」です。

先生と生徒の振り返り会話

生徒

先生、まとめありがとうございました!C#でDateTimeを扱うとき、ライブラリの設定ひとつでこんなに柔軟に形を変えられるんですね。プロパティごとに個別に指定できる [JsonConverter] 属性はすごく便利そうです!

先生

その通りです。プロジェクト全体で統一したいときは JsonSerializerSettings を使い、特定の項目だけ特殊な形式にしたいときは属性を使う、といった使い分けができるようになると中級者への一歩ですね。特にWeb APIを開発するときは、フロントエンド側のJavaScriptが扱いやすい ISO 8601 形式にするか、それとも人間が見て分かりやすい形式にするか、チーム内で事前に決めておくのがコツですよ。

生徒

なるほど。あと、COBOLの話が出てきたのも驚きました。古いシステムとの連携でも、JSONのフォーマット指定が架け橋になるんですね。データの形式を合わせることは、プログラミング言語の壁を越えるために必要なスキルなんだと感じました。

先生

良い気づきですね。日付や時刻は、一見シンプルですがタイムゾーンやうるう秒など、奥が深い要素がたくさんあります。まずは自分の思い通りの文字列としてJSONに出力できるよう、今回学んだ方法を実際のコードで試してみてください。エラーが出たときに、どこのフォーマットがズレているのかを突き止める力も養われますよ。

生徒

はい!さっそく自分のプロジェクトでも、System.Text.Json のカスタムコンバータを実装してみようと思います。ありがとうございました!

カテゴリの一覧へ
新着記事
New1
C#
C#のDictionary(辞書)の使い方を初心者向けに完全解説!キーと値でデータ管理を学ぼう
New2
C#
C#の数値型をマスターしよう!int・double・decimalの違いと使い方
New3
C#
C#で始めるIoT開発!音声認識とスピーカー制御の仕組みを解説
New4
Azure
Azure Reposの使い方を徹底解説!Gitによるソースコード管理とブランチ戦略(Gitflow)
人気記事
No.1
Java&Spring記事人気No1
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.4
Java&Spring記事人気No4
Azure
Azureストレージの冗長性比較!LRS/GRS/ZRSの選び方とコストの最適解を完全解説
No.5
Java&Spring記事人気No5
C#
C#のログ出力入門!SerilogとNLogの使い方を徹底解説
No.6
Java&Spring記事人気No6
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本
No.8
Java&Spring記事人気No8
COBOL
COBOLの小数点の扱いと符号付きデータ型(S, V)の使い方を初心者向けに解説!