C# - よく使うクラス - DateTime・TimeSpan - DateTime

クラウディア 
1. 概要
2. 初期化
3. 文字列化
4. 文字列を DateTime へ
5. 加減算
6. 比較
7. 差

1. 概要

 参考サイトには、「特定の時点を表します。通常、日時形式で表されます。」と説明されています。  本ページは、下記のサイトを参考にさせていただきました。
DateTime 構造体 (System)」
「DateTime.Subtract メソッド (System) 

2. 初期化

 現在日時で初期化するには、下記のように記述します。

DateTime myDateTime = DateTime.Now;
 他に、わたしがよく使うのが、以下のものです。

DateTime(年, 月, 日);
DateTime(年, 月, 日, 時, 分, 秒);
DateTime(年, 月, 日, 時, 分, 秒, ㍉秒);

3. 文字列化

 いつか詳細を書くかもしれませんが、とりあえず、日本人に一番なじみの深い書式でフォーマットするならば・・・。

DateTime.Now.ToString("yyyy年MM月dd月 HH:mm:ss")
 ですかな。

4. 文字列を DateTime へ

 前項の逆です。

DateTime = System.DateTime.ParseExact(文字列, 書式, null);
 書式は、前項に出てくるようなものです。  文字列が不正なときは、「ArgumentNullException」(文字列または書式が null)、「FormatException」(文字列または書式がからの文字列か、日時として不正)の例外が発生します。

5. DateTime 加減算

 「TimeSpan」は、時刻のデータを加減算するのに便利ですが、「DateTime」自体に、「Addxxx」というメソッド年・月・日・時・分・秒・㍉秒があり、それぞれ、下記のようになっています。

AddYears(Int32);
AddMonths(Int32);
AddDays(Double);
AddHours(Double);
AddMinutes(Double);
AddSeconds(Double);
AddMilliseconds(Double);
 月や日の計算では、大小や閏月の計算や月替わりの処理を問題なくやってくれます。  日以下の単位の場合、「Double」なので、小数点以下の計算もやってくれるので便利です。

using System;
using System.IO;
using static System.DateTime;

public class myDateTime
{
	static public void Main ()
	{
		DateTime t = new DateTime(2023, 1, 1);

		for (int i=0; i<24; i++)
		{
        	Console.WriteLine(t.ToString("yyyy年MM月dd日 HH:mm:ss"));
			t = t.AddMonths(1);
		}

		Console.WriteLine("");

		t = new DateTime(2024, 2, 28);

		for (int i=0; i<3; i++)
		{
        	Console.WriteLine(t.ToString("yyyy年MM月dd日 HH:mm:ss"));
			t = t.AddDays(1);
		}

		Console.WriteLine("");
       	Console.WriteLine(t.ToString("yyyy年MM月dd日 HH:mm:ss"));

		t = t.AddDays(0.5);
       	Console.WriteLine(t.ToString("yyyy年MM月dd日 HH:mm:ss"));

		t = t.AddHours(0.5);
       	Console.WriteLine(t.ToString("yyyy年MM月dd日 HH:mm:ss"));

		t = t.AddHours(1.5);
       	Console.WriteLine(t.ToString("yyyy年MM月dd日 HH:mm:ss"));
	}
}
 てなソースを書いて、実行すると下記の結果が得られます。

2023年01月01日 00:00:00
2023年02月01日 00:00:00
2023年03月01日 00:00:00
2023年04月01日 00:00:00
2023年05月01日 00:00:00
2023年06月01日 00:00:00
2023年07月01日 00:00:00
2023年08月01日 00:00:00
2023年09月01日 00:00:00
2023年10月01日 00:00:00
2023年11月01日 00:00:00
2023年12月01日 00:00:00
2024年01月01日 00:00:00
2024年02月01日 00:00:00
2024年03月01日 00:00:00
2024年04月01日 00:00:00
2024年05月01日 00:00:00
2024年06月01日 00:00:00
2024年07月01日 00:00:00
2024年08月01日 00:00:00
2024年09月01日 00:00:00
2024年10月01日 00:00:00
2024年11月01日 00:00:00
2024年12月01日 00:00:00

2024年02月28日 00:00:00
2024年02月29日 00:00:00
2024年03月01日 00:00:00

2024年03月02日 00:00:00
2024年03月02日 12:00:00
2024年03月02日 12:30:00
2024年03月02日 14:00:00

6. 比較

 「DateTime」型は、単純に「<」「>」等を使用して、大小比較を行うことはできません(コンパイルエラーになります)。

DateTime.Compare(DateTime t1, DateTime t2);
 という「static」メソッドを使用します。

using System;
using System.IO;
using static System.DateTime;

public class myDateTime
{
	static public void Main ()
	{
		DateTime t1 = new DateTime(2023, 1, 1);
		DateTime t2 = new DateTime(2023, 1, 2);

		Console.WriteLine(DateTime.Compare(t1, t2));
		Console.WriteLine(DateTime.Compare(t2, t1));
		Console.WriteLine(DateTime.Compare(t1, t1));
	}
}
 というソースを書いて、実行すると下記の結果が得られます。

-1
1
0
 この例だと、リターン値として「-1」「0」「1」が返っていますが、仕様ではリターン値は整数値で ・「0 より小さい値」 第一引数が第二引数よりも前 ・「0」 第一引数と第二引数とが同じ日時 ・「0 より大きい値」 第一引数が第二引数よりも後  となりますのでご注意。

7. 差

 「DateTime.Subtract()」というメソッドを使って、時刻の差を求めます。

DateTime.Subtract(TimeSpan)
 で、「DateTime」から指定した「TimsSpan」が経過した日時を「DateTime」形式で取得します。

DateTime.Subtract(DateTIme)
 で、元の「DateTime」と引数の「DateTime」との日時差を「TimeSpan」形式で取得します。

using System;
using System.IO;
using static System.DateTime;

public class Program
{
	static public void Main ()
	{
		DateTime t1 = DateTime.Now;
		DateTime t2 = t1.AddMinutes(10);

       	Console.WriteLine("     ["+ t1.ToString("yyyy年MM月dd日 HH:mm:ss") +"]");
       	Console.WriteLine("5分前["+ t1.Subtract(new TimeSpan(0, 5, 0)).ToString("yyyy年MM月dd日 HH:mm:ss") +"]");
       	Console.WriteLine("     ["+ t2.ToString("yyyy年MM月dd日 HH:mm:ss") +"] との時刻差["+ t2.Subtract(t1).ToString() +"]");
	}
}
 てなソースを書いて実行すると、結果は、実行した日時によりますが、例えば、下記のような結果になります。

     [2025年03月18日 08:33:57]
5分前[2025年03月18日 08:28:57]
     [2025年03月18日 08:43:57] との時刻差[00:10:00]
earthcar(アースカー)
損保との違い
Star Naming Gift
健康サポート特集