カテゴリ: C# 更新日: 2025/12/07

C#で日付操作の落とし穴と注意点を解説|初心者向けにわかりやすく丁寧に解説

C#で日付操作の落とし穴と注意点を解説
C#で日付操作の落とし穴と注意点を解説

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

生徒

「C#で日付や時間を操作するときに、注意しないと失敗することがありますか?」

先生

「ありますよ。日付と時間の処理には、特に初心者がつまずきやすい落とし穴がいくつかあります。」

生徒

「落とし穴って何ですか?具体的に教えてください!」

先生

「それでは、C#で日付操作をするときに知っておくべき大切なポイントを順番に見ていきましょう。」

1. DateTimeは「瞬間」を表すが文化圏で解釈が変わる

1. DateTimeは「瞬間」を表すが文化圏で解釈が変わる
1. DateTimeは「瞬間」を表すが文化圏で解釈が変わる

C#のDateTime型は、ある瞬間の日時を表す型です。しかし、実際には同じ時間でも「どの国や地域(タイムゾーン)」で解釈するかによって異なる意味になってしまうことがあります。これは、日時が国や地域によって時差があるためです。

例えば、同じ2025/11/27 10:00という時間でも、日本とアメリカでは実際の時刻が違います。この違いを無視すると、システムが誤った動作をすることがあります。

初心者がよくやってしまう失敗例として、「DateTimeだけで扱い、タイムゾーンを考えない」というケースがあります。表示に使用する時間と内部処理で使う時間を混ぜてしまうと、データがずれてしまいます。

2. DateTime.NowとDateTime.UtcNowの違いを理解しよう

2. DateTime.NowとDateTime.UtcNowの違いを理解しよう
2. DateTime.NowとDateTime.UtcNowの違いを理解しよう

日付や時間を取得する方法としてよく使われるものに、DateTime.NowDateTime.UtcNowがあります。見た目は似ていますが、意味が大きく異なります。


var localTime = DateTime.Now;
var utcTime = DateTime.UtcNow;

DateTime.Nowは「現在のPCが設定している地域の時間」を返します。日本で実行すれば日本時間、アメリカで実行すればアメリカ時間になります。

一方、DateTime.UtcNowは世界共通の協定世界時(UTC)の時間です。時差の影響を受けないため、データを保存する際に非常に便利です。

3. AddDaysでの計算は存在しない日付に注意

3. AddDaysでの計算は存在しない日付に注意
3. AddDaysでの計算は存在しない日付に注意

日付を計算するときによく使われるのがAddDaysAddMonthsといったメソッドです。ただし、操作する日付によっては存在しない日付が発生してしまうことがあります。特に注意が必要なのが月をまたぐ計算です。


var date = new DateTime(2025, 1, 31);
var result = date.AddMonths(1);
Console.WriteLine(result);

2025/03/03 00:00:00

31日に1ヶ月足した場合、本来の2月には31日が存在しないため、C#は自動的に日数を調整して3月3日になります。これに気付かず動かすと、締め日処理やバッチ処理で誤動作する可能性があります。

月末処理を正確に行うには、必ずDateTime.DaysInMonth()を利用することで防ぐことができます。

4. 文字列から日付変換はフォーマット違いに注意

4. 文字列から日付変換はフォーマット違いに注意
4. 文字列から日付変換はフォーマット違いに注意

ユーザー入力など、文字列から日付に変換する場合には、フォーマットの違いでエラーが起きやすいです。


var date = DateTime.Parse("2025/11/27");

上の例は日本の形式ですが、アメリカでは11/27/2025と書くのが一般的です。異なる環境で動かすと例外(エラー)が発生することがあります。これを防ぐ方法がDateTime.ParseExactです。


var date = DateTime.ParseExact("2025/11/27", "yyyy/MM/dd", null);

フォーマットを指定することで、常に同じ結果を得られ、予期せぬエラーを防げます。

5. 日付の比較は文字列では行わない

5. 日付の比較は文字列では行わない
5. 日付の比較は文字列では行わない

初心者がやってしまう代表的な間違いは、日付を文字列のまま比較してしまうことです。


var a = "2025/11/27";
var b = "2025/1/1";
Console.WriteLine(a > b);

True

これは文字列として比較しているために正しい結果になりません。必ずDateTime型に変換してから比較しましょう。


var d1 = DateTime.Parse(a);
var d2 = DateTime.Parse(b);
Console.WriteLine(d1 > d2);
カテゴリの一覧へ
新着記事
New1
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New2
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New3
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
New4
COBOL
COBOLの帳票出力を完全攻略!数値項目のカンマ・小数点編集例を徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.3
Java&Spring記事人気No3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.4
Java&Spring記事人気No4
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法
No.8
Java&Spring記事人気No8
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決