日時.ToString() / 日時.AddDays()
| 対応: | C# 1.0(2002) |
|---|
日時を指定した書式の文字列に変換する『ToString()』と、日時に日数・時間などを加減算する『AddDays()』などのメソッドです。
構文
// 日時を書式指定で文字列化します。 string s = dt.ToString(string format); // 日数を加算します(負の値で減算)。 DateTime newDt = dt.AddDays(double value); // その他の加算メソッドも同じ形式です。 DateTime newDt = dt.AddHours(double value); DateTime newDt = dt.AddMinutes(double value); DateTime newDt = dt.AddMonths(int months); DateTime newDt = dt.AddYears(int years);
メソッド一覧
| メソッド | 概要 |
|---|---|
| ToString("yyyy/MM/dd") | 年月日を / 区切りで出力します(例:2024/01/15)。 |
| ToString("yyyy年M月d日") | 日本語形式で出力します(例:2024年1月15日)。 |
| ToString("HH:mm:ss") | 時刻を24時間形式で出力します(例:14:30:00)。 |
| AddDays(n) | n 日後の日時を返します。負の値で n 日前になります。元の日時は変更されません。 |
| AddMonths(n) | n ヶ月後の日時を返します。 |
| AddYears(n) | n 年後の日時を返します。 |
| AddHours(n) | n 時間後の日時を返します。 |
サンプルコード
Program.cs
using System;
DateTime dt = new DateTime(2024, 1, 15, 14, 30, 45);
// ToString() で書式を指定して文字列化します。
Console.WriteLine(dt.ToString("yyyy/MM/dd")); // 2024/01/15
Console.WriteLine(dt.ToString("yyyy年M月d日")); // 2024年1月15日
Console.WriteLine(dt.ToString("HH:mm:ss")); // 14:30:45
Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm")); // 2024/01/15 14:30
Console.WriteLine(dt.ToString("yyyyMMdd")); // 20240115
// 文字列補間でも書式指定が使えます。
Console.WriteLine($"{dt:yyyy年M月d日(ddd)}"); // 2024年1月15日(Mon)
// AddDays() で日数を加算します。
DateTime dayAfterTomorrow = dt.AddDays(2);
Console.WriteLine(dayAfterTomorrow.ToString("yyyy/MM/dd")); // 2024/01/17
// 負の値で減算します。
DateTime yesterday = dt.AddDays(-1);
Console.WriteLine(yesterday.ToString("yyyy/MM/dd")); // 2024/01/14
// 月・年・時間も加算できます。
Console.WriteLine(dt.AddMonths(3).ToString("yyyy/MM/dd")); // 2024/04/15
Console.WriteLine(dt.AddYears(1).ToString("yyyy/MM/dd")); // 2025/01/15
Console.WriteLine(dt.AddHours(8).ToString("HH:mm")); // 22:30
コンパイルして実行すると次のようになります。
dotnet script datetime_tostring_adddays.csx 2024/01/15 2024年1月15日 14:30:45 2024/01/15 14:30 20240115 2024年1月15日(Mon) 2024/01/17 2024/01/14 2024/04/15 2025/01/15 22:30
実践パターン: スケジュール計算
予定日から締め切りや次のイベント日を計算するパターンです。Makise Kurisu のタイムライン管理を例にします。
Schedule.cs
using System;
// 基準日を設定します(論文投稿日)
DateTime submissionDate = new DateTime(2024, 6, 1);
// 14日後の査読期限を計算します。
DateTime reviewDeadline = submissionDate.AddDays(14);
Console.WriteLine($"査読期限: {reviewDeadline:yyyy/MM/dd}");
// 3ヶ月後の出版日を計算します。
DateTime publishDate = submissionDate.AddMonths(3);
Console.WriteLine($"出版予定: {publishDate:yyyy/MM/dd}");
// 今日から締め切りまでの残り日数を計算します。
TimeSpan remaining = reviewDeadline - DateTime.Today;
Console.WriteLine($"査読期限まで: {(int)remaining.TotalDays} 日");
// 前日・翌日のリマインダー日を生成します。
DateTime reminderDay = reviewDeadline.AddDays(-1);
Console.WriteLine($"リマインダー: {reminderDay:yyyy/MM/dd(ddd)}");
コンパイルして実行すると次のようになります。
dotnet script schedule.csx 査読期限: 2024/06/15 出版予定: 2024/09/01 査読期限まで: 75 日 リマインダー: 2024/06/14(Fri)
実践パターン: 書式パターン一覧
よく使う書式パターンをまとめたサンプルです。
FormatPatterns.cs
using System;
DateTime dt = new DateTime(2024, 1, 15, 8, 5, 9);
// 日付系書式
Console.WriteLine(dt.ToString("yyyy/MM/dd")); // 2024/01/15(ゼロ埋め)
Console.WriteLine(dt.ToString("yyyy/M/d")); // 2024/1/15(ゼロなし)
Console.WriteLine(dt.ToString("yyyyMMdd")); // 20240115(ファイル名向け)
Console.WriteLine(dt.ToString("dddd, MMMM d")); // Monday, January 15(英語)
// 時刻系書式
Console.WriteLine(dt.ToString("HH:mm:ss")); // 08:05:09(24時間・ゼロ埋め)
Console.WriteLine(dt.ToString("H:mm")); // 8:05(24時間・ゼロなし)
Console.WriteLine(dt.ToString("hh:mm tt")); // 08:05 AM(12時間)
// 日付+時刻
Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss")); // 2024-01-15 08:05:09
Console.WriteLine(dt.ToString("o")); // ISO 8601 形式
// 標準書式指定子
Console.WriteLine(dt.ToString("d")); // 2024/01/15(短い日付)
Console.WriteLine(dt.ToString("D")); // 2024年1月15日(長い日付)
Console.WriteLine(dt.ToString("t")); // 8:05(短い時刻)
Console.WriteLine(dt.ToString("f")); // 2024年1月15日 8:05(長い日付 + 短い時刻)
コンパイルして実行すると次のようになります。
dotnet script format_patterns.csx 2024/01/15 2024/1/15 20240115 Monday, January 15 08:05:09 8:05 08:05 AM 2024-01-15 08:05:09 2024-01-15T08:05:09.0000000 2024/01/15 2024年1月15日 8:05 2024年1月15日 8:05
よくあるミス
よくあるミス: M(月)と m(分)、H(時)と h(12時間)の混同
書式文字列は大文字・小文字で意味が変わります。特に M と m は間違えやすく、意図しない出力になります。
using System;
DateTime dt = new DateTime(2024, 3, 15, 14, 30, 0);
// NG: M(月)と m(分)を混同した例
Console.WriteLine(dt.ToString("yyyy/mm/dd")); // yyyy/30/15 ← 月ではなく分が入ります!
// OK: 月は M(大文字)
Console.WriteLine(dt.ToString("yyyy/MM/dd")); // 2024/03/15
// NG: HH(24時間)と hh(12時間)の混同
Console.WriteLine(dt.ToString("hh:mm:ss")); // 02:30:00(12時間表示になります)
// OK: 24時間表示には HH(大文字)
Console.WriteLine(dt.ToString("HH:mm:ss")); // 14:30:00
修正後は次の通りです。
dotnet run yyyy/30/15 2024/03/15 02:30:00 14:30:00
概要
『AddDays()』などの加算メソッドは元の DateTime 値を変更しません。戻り値として新しい DateTime を返すため、必ず変数に代入して使います。
書式文字列では yyyy(4桁年)、MM(2桁月)、dd(2桁日)、HH(24時間制時)が基本です。M(大文字)は月、m(小文字)は分になるため大文字・小文字を間違えると意図しない出力になります。
2つの日時の差分計算には『TimeSpan / 日時の差分計算』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。