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秒以下なら処理する
みたいな判断が簡単にできちゃいます。
参考
こちらを参考にしました。ありがとうございました。
あとがき
C# TimeSpanを色々試した話でした!
DateTime型の減算をしたときにたまたま知ったのですが、思ったより簡単で便利そうです。
時間を扱ったものを作るときにどうぞ!