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


 クラウディア


1. 概要
2. 初期化
3. 文字列化
4. 割り算
5. 比較

1. 概要

 参考サイトには、「時間間隔を表します。」と説明されています。  本ページは、下記のサイトを参考にさせていただきました。
TimeSpan 構造体 (System)」
「【C#】TimeSpan に割り算を適用する方法

2. TimeSpan 初期化

 以下の、いずれかで初期化します。  「DateTime」は、現在日時での初期化しか例示しませんでしたが、「TimeSpan」は、これがすべてです。

TimeSpan(時, 分, 秒);
TimeSpan(日, 時, 分, 秒);
TimeSpan(日, 時, 分, 秒, ミリ秒);
TimeSpan(ナノ秒);
 いずれの引き数も、「Int32」で、マイナス値も可です。

3. 文字列化


TimeSpan.ToString(書式);
 で、記述します。  注意しなければならないのは、書式指定子以外の「:」や「-」を書式の中に入れるときは「\」でエスケープしなければなりません。  ここが、「TimeSpan」の注意点で、エスケープしないと、予想しなかった文字列が出力されることになります。

4. 割り算

 「『TimeSpan』を割り算?」という命題に直面したのだ。  参考サイトを読んで、なるほどと納得できる部分がありました。  参考サイトには、こう書かれておりました。

var t1 = new TimeSpan(0, 0, 60);
var t2 = new TimeSpan(t1.Ticks/10);
 なるほど。

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

public class myDateTime
{
	static public void Main ()
	{
		DateTime t1 = DateTime.Now;
		DateTime t2 = t1.AddYears(1);

		TimeSpan s1 = t2 - t1;
		TimeSpan s2 = new TimeSpan(s1.Ticks/2);

		DateTime t3 = t1 + s2;

       	Console.WriteLine("t1["+ t1.ToString("yyyy年MM月dd日 HH:mm:ss") +"]");
       	Console.WriteLine("t2["+ t2.ToString("yyyy年MM月dd日 HH:mm:ss") +"]");
       	Console.WriteLine("t3["+ t3.ToString("yyyy年MM月dd日 HH:mm:ss") +"]" + Environment.NewLine);
       	Console.WriteLine("s2["+ s2.ToString() +"]");
	}
}
 てなソースを書いて、ビルド・実行すると下記の結果が得られます(当然、実行日時で、前半3行の結果は変わるわけですが)。

t1[2023年06月02日 08:16:03]
t2[2024年06月02日 08:16:03]
t3[2023年12月02日 08:16:03]

s2[183.00:00:00]

5. 比較

 「TimeSpan」同士の比較は、「Compare()」「CompareTo()」というメソッドを使用するか、直接論理式で書くこともできます。

TimeSpan.Compare(TimeSpan t1, TimeSpan t2);
 で、「t1」「t2」を比較して、「t1」が大きければ 1、「t1」が小さければ -1、等しければ 0 が返ります。

TimeSpan.CompareTo(TimeSpan)
 で、元となる「TimeSpan」と引数の「TimeSpan」を比較し、元が大きければ 1、元が小さければ -1、等しければ 0 が返ります。  これら、慣れていれば、わかりますが、直感的にはわかりにくい。  直接論理式で書く方が、わかりやすいように思います。

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

public class Program
{
	static public void Main ()
	{
		TimeSpan span3m = new TimeSpan(0, 3, 0);
		TimeSpan span5m = new TimeSpan(0, 5, 0);
		TimeSpan spanEq = new TimeSpan(0, 5, 0);
		TimeSpan span7m = new TimeSpan(0, 7, 0);

		Compare(span5m, span3m);
		Compare(span5m, spanEq);
		Compare(span5m, span7m);

		CompareTo(span5m, span3m);
		CompareTo(span5m, spanEq);
		CompareTo(span5m, span7m);

		CompareLogic(span5m, span3m);
		CompareLogic(span5m, spanEq);
		CompareLogic(span5m, span7m);
	}

	private static void Compare(TimeSpan t1, TimeSpan t2)
	{
       	Console.WriteLine("Compare("+ t1.ToString() +", "+ t2.ToString() +")   → "+ TimeSpan.Compare(t1, t2).ToString().PadLeft(2) +"");
	}

	private static void CompareTo(TimeSpan t1, TimeSpan t2)
	{
       	Console.WriteLine(t1.ToString() +".CompareTo("+ t2.ToString() +")  → "+ t1.CompareTo(t2).ToString().PadLeft(2) +"");
	}

	private static void CompareLogic(TimeSpan t1, TimeSpan t2)
	{
		if (t1 > t2)
		{
	       	Console.WriteLine("["+ t1.ToString() +"] は ["+ t2.ToString() +"] より大きい");
		}
		else
		if (t1 < t2)
		{
	       	Console.WriteLine("["+ t1.ToString() +"] は ["+ t2.ToString() +"] より小さい");
		}
		else
		{
	       	Console.WriteLine("["+ t1.ToString() +"] は ["+ t2.ToString() +"] と等しい");
		}
	}
}
 というソースを書いて、実行すると下記の結果が得られます。

Compare(00:05:00, 00:03:00)   →  1
Compare(00:05:00, 00:05:00)   →  0
Compare(00:05:00, 00:07:00)   → -1
00:05:00.CompareTo(00:03:00)  →  1
00:05:00.CompareTo(00:05:00)  →  0
00:05:00.CompareTo(00:07:00)  → -1
[00:05:00] は [00:03:00] より大きい
[00:05:00] は [00:05:00] と等しい
[00:05:00] は [00:07:00] より小さい

earthcar(アースカー)
ハイスピードプラン