- 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] より小さい
|