lisz-works

技術と興味の集合体

C# TimeSpanを色々試したぞ!

【スポンサーリンク】

C#

C#の時間を表すオブジェクト「TimeSpan」を色々試しました!

DateTime型とも絡みに使えたり、時間を簡単に作れたり、地味に便利です!

TimeSpanとは

DateTimeが時刻なのに対して、時間を表すオブジェクトです。

今回初めて使ってみて、地味に便利!と感じたオブジェクトです。

インスタンス生成

コンストラクタで値を設定して、TimeSpanを作る事ができます。

なにも指定しないは、0となります。

Console.WriteLine(new TimeSpan().ToString());        // 00:00:00
Console.WriteLine(new TimeSpan(1).ToString());       // 00:00:00.0000001
// Console.WriteLine(new TimeSpan(1,2).ToString());  // err
Console.WriteLine(new TimeSpan(1,2,3).ToString());   // 01:02:03
Console.WriteLine(new TimeSpan(1,2,3,4).ToString()); // 1.02:03:04
----------
00:00:00
00:00:00.0000001
01:02:03
1.02:03:04

引数が2つのものはエラーとなるので注意しましょう。

時間の繰り上げ

コンストラクタから生成する場合、時間の繰り上げを勝手にやってくれます。

Console.WriteLine(new TimeSpan(1,2,3,4,5).ToString());     // 1.02:03:04.0050000
Console.WriteLine(new TimeSpan(0,0,0,0,1000).ToString());  // 00:00:01
Console.WriteLine(new TimeSpan(0,0,0,60,0).ToString());    // 00:01:00
Console.WriteLine(new TimeSpan(0,0,60,0,0).ToString());    // 01:00:00
Console.WriteLine(new TimeSpan(0,24,0,0,0).ToString());    // 1.00:00:00
----------
1.02:03:04.0050000
00:00:01
00:01:00
01:00:00
1.00:00:00

なので「秒単位のデータ」などをTimeSpan型にするときとかに、めっちゃ便利です。

int inputSec = 5000; // 5000秒のデータが入力された
TimeSpan time = new TimeSpan(0,0,0,inputSec);
Console.WriteLine("time=" + time.ToString());
----------
time=01:23:20

時間計算頑張らなくても、勝手にコレやってくるのは超便利ですね!

ちょっとした文字列操作や値操作ができれば、セットするだけでTimeSpanは簡単に時間を作り出してくれます。

DateTime - DateTime = TimeSpan

DateTime同士を減算すると、TimeSpanが返されます。

DateTime s = DateTime.Parse("2019/12/06 13:50");
DateTime e = DateTime.Parse("2019/12/06 13:55");
TimeSpan elapse = e - s;
Console.WriteLine(s.ToString()); // 12/6/2019 1:50:00 PM
Console.WriteLine(e.ToString()); // 12/6/2019 1:55:00 PM
Console.WriteLine(elapse.ToString()); // 00:05:00
----------
12/6/2019 1:50:00 PM
12/6/2019 1:55:00 PM
00:05:00

「どれだけの時間かかったか?」を計算するときなど便利ですね。

文字列からパース

フォーマットにあった文字列を渡すと、TimeSpan型にパースしてくれます。

Console.WriteLine(TimeSpan.Parse("1"));             // 1.00:00:00
Console.WriteLine(TimeSpan.Parse("1:2"));           // 01:02:00
Console.WriteLine(TimeSpan.Parse("1:2:3"));         // 01:02:03
Console.WriteLine(TimeSpan.Parse("1.2:3:4"));       // 1.02:03:04
// Console.WriteLine(TimeSpan.Parse("1:2:3:4:5"));  // err(msの区切りは'.')
// Console.WriteLine(TimeSpan.Parse("1.23"));       // err(hour,min,secは必須)
// Console.WriteLine(TimeSpan.Parse("1:2.34"));     // err(hour,min,secは必須)
Console.WriteLine(TimeSpan.Parse("1:2:3.45"));      // 01:02:03.4500000
Console.WriteLine(TimeSpan.Parse("1:2:3:4.567"));   // 1.02:03:04.5670000
Console.WriteLine(TimeSpan.Parse("1.2:3:4.567"));   // 1.02:03:04.5670000
----------
1.00:00:00
01:02:00
01:02:03
1.02:03:04
01:02:03.4500000
1.02:03:04.5670000
1.02:03:04.5670000

hour,min,secが必須だったり、msの区切りが'.'なので注意しましょう。

dayは':'でも'.'でもいいみたいです。謎です。

TimeSpanの比較

比較演算子を使うことで、TimeSpan同士を比較することができます。

DateTime s = DateTime.Parse("2019/12/06 13:50");
DateTime e = DateTime.Parse("2019/12/06 13:55");
TimeSpan span = TimeSpan.Parse("0:5:0");
Console.WriteLine((span == (e - s)));   // True
Console.WriteLine((span != (e - s)));   // False
Console.WriteLine((span < (e - s)));    // False
Console.WriteLine((span > (e - s)));    // False
Console.WriteLine((span <= (e - s)));   // True
Console.WriteLine((span >= (e - s)));   // True
----------
True
False
False
False
True
True

なのでDateTimeの時間差分で作ったTimeSpanと、チェックしたい時間のTimeSpanを作れば

N秒以下なら処理する

みたいな判断が簡単にできちゃいます。

参考

こちらを参考にしました。ありがとうございました。

docs.microsoft.com

dobon.net

あとがき

C# TimeSpanを色々試した話でした!

DateTime型の減算をしたときにたまたま知ったのですが、思ったより簡単で便利そうです。

時間を扱ったものを作るときにどうぞ!