C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

TimeSpan で指定した時間の一部を判定して取得したい

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■91321 / inTopicNo.1)  TimeSpan で指定した時間の一部を判定して取得したい
  
□投稿者/ Kow (1回)-(2019/06/16(Sun) 15:28:19)

分類:[.NET 全般] 

C#で時間のかかった一部を判定したいのですが…
例えば



var start = TimeSpan.Parse("19:00");//ここは変動する
var end = TimeSpan.Parse("3:00");//次の日の3時 ここも変動する

start と end の間に 22:00〜5:00がある場合何時間なのかを知りたいのです。

よろしくお願いします。
引用返信 編集キー/
■91322 / inTopicNo.2)  Re[1]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ kiku (92回)-(2019/06/16(Sun) 16:19:20)
No91321 (Kow さん) に返信
> C#で時間のかかった一部を判定したいのですが…
> 例えば
>
>
>
> var start = TimeSpan.Parse("19:00");//ここは変動する
> var end = TimeSpan.Parse("3:00");//次の日の3時 ここも変動する
>
> start と end の間に 22:00〜5:00がある場合何時間なのかを知りたいのです。
>
> よろしくお願いします。

上記の例の場合、結果はどのように計算して、何時間になるのが正しいですか?
引用返信 編集キー/
■91323 / inTopicNo.3)  Re[2]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ kiku (93回)-(2019/06/16(Sun) 16:53:53)
        private void test()
        {
            var today = DateTime.Today;
            var tomorrow = DateTime.Today.AddDays(1);

            DateTime 入力開始 = today + new TimeSpan(19, 0, 0);
            DateTime 入力終了 = tomorrow + new TimeSpan(3, 0, 0);

            DateTime 比較開始 = today + new TimeSpan(22, 0, 0);
            DateTime 比較終了 = tomorrow + new TimeSpan(5, 0, 0);

            var 入力差分 = 入力終了 - 入力開始;

            var 比較差分 = 比較終了 - 比較開始;

            DateTime 計算開始;
            if (入力開始 <= 比較開始 && 比較開始 <= 入力終了)
            {
                //入力開始と入力終了の間に、比較開始が入っているか?
                計算開始 = 比較開始;
            }
            else if (比較開始 < 入力開始 && 比較開始 < 入力終了)
            {
                //比較開始は入力開始よりも小さく、入力終了よりも小さい
                計算開始 = 入力開始;
            }
            else
            {
                //比較開始は入力開始よりも大きく、入力終了よりも大きい
                //重なっている部分なし
                return;
            }

            DateTime 計算終了;
            if (入力開始 <= 比較終了 && 比較終了 <= 入力終了)
            {
                //入力開始と入力終了の間に、比較終了が入っているか?
                計算終了 = 比較終了;
            }
            else if (比較終了 < 入力開始 && 比較終了 < 入力終了)
            {
                //比較終了は入力開始よりも小さく、入力終了よりも小さい
                //重なっている部分なし
                return;
            }
            else
            {
                //比較終了は入力開始よりも大きく、入力終了よりも大きい
                計算終了 = 入力終了;
            }

            var 重なり部分 = 計算終了 - 計算開始;
        }

引用返信 編集キー/
■91324 / inTopicNo.4)  Re[3]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ Kow (2回)-(2019/06/16(Sun) 20:43:44)
19時から3時の22時から5時までなので5時間になればいいです。

引用返信 編集キー/
■91328 / inTopicNo.5)  Re[4]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ キングダム (36回)-(2019/06/16(Sun) 23:54:35)
No91324 (Kow さん) に返信

時間の数列に変換して積を取るとか
https://paiza.io/projects/NTS4aXYC6YvPm_D6Tr4kWA

分を指定するなら変えないとイケないですけど
引用返信 編集キー/
■91331 / inTopicNo.6)  Re[4]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ 魔界の仮面弁士 (2207回)-(2019/06/17(Mon) 01:00:19)
No91321 (Kow さん) に返信
> var start = TimeSpan.Parse("19:00");//ここは変動する
> var end = TimeSpan.Parse("3:00");//次の日の3時 ここも変動する
> start と end の間に 22:00〜5:00がある場合何時間なのかを知りたいのです。

深夜残業計算なのかな…。

・「end = TimeSpan.Parse("3:00")」と「end = new TimeSpan(27, 0, 0)」を区別するか
・「end = TimeSpan.FromHourse(40.0)」を許容するか否か
・「start = TimeSpan.Parse("05:00")」「end = TimeSpan.Parse("05:00")」の扱いをどうするか
・「start = TimeSpan.Parse("04:00")」「end = TimeSpan.Parse("03:00")」の扱いをどうするか

などなど、細かいルール面が曖昧なので、仕様漏れが無いよう厳密に再定義した方が良いかと思います。


No91324 (Kow さん) に返信
> 19時から3時の22時から5時までなので5時間になればいいです。

ということは、「以上未満」算出ではなく、「以上以下」算出ですか。

static TimeSpan Example(TimeSpan start, TimeSpan end)
{
  #region "取りうる期間の仕様が不明瞭なので、入力値が「05:00〜翌05:00」の範囲という前提にしてみた"
  // 5 時基準で 24 時越えを補正してみる
  if (start <= TimeSpan.FromHours(5.0)) { start += TimeSpan.FromDays(1.0); }
  if (end <= TimeSpan.FromHours(5.0)) { end += TimeSpan.FromDays(1.0); }
  // 24 時間を超える期間は設問上未定義なので想定しない
  if ((end - start).TotalHours > 24.0) { throw new ArgumentOutOfRangeException(); }
  #endregion

  if (end <= start || end <= TimeSpan.FromHours(22.0)) { return TimeSpan.Zero; }
  Func<TimeSpan, TimeSpan, TimeSpan> Max = (a, b) => (a < b) ? b : a;
  Func<TimeSpan, TimeSpan, TimeSpan> Min = (a, b) => (a < b) ? a : b;
  return Min(TimeSpan.FromHours(29.0), end) - Max(TimeSpan.FromHours(22.0), start);
}
引用返信 編集キー/
■91332 / inTopicNo.7)  Re[5]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ 魔界の仮面弁士 (2208回)-(2019/06/17(Mon) 01:28:47)
No91328 (キングダム さん) に返信
> 時間の数列に変換して積を取るとか
> https://paiza.io/projects/NTS4aXYC6YvPm_D6Tr4kWA

この実装だと、01:00〜03:00 → 2時間 などのパターンが漏れるかも。
引用返信 編集キー/
■91335 / inTopicNo.8)  Re[6]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ キングダム (37回)-(2019/06/17(Mon) 07:13:37)
No91332 (魔界の仮面弁士 さん) に返信

じゃあどうすればいんですか!?(逆ギレ)
ウソですよ冗談ですw

おっしゃるとおりですね


引用返信 編集キー/
■91336 / inTopicNo.9)  Re[1]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ shu (1183回)-(2019/06/17(Mon) 07:15:54)
2019/06/17(Mon) 07:17:10 編集(投稿者)

No91321 (Kow さん) に返信

分の部分は別に考えるとして
startに対するstartの日に対する時間、startHour
endに対するstartの日に対する時間、endHour
を考えると
startHour = 19
endHour = 27
となります。
22:00〜5:00について同様に考えると(startHour2,endHour2)
startHour2 = 22
endHour2 = 29
となります。
startHour,startHour2の大きい方startHour3=startHour2=22
endHour,endHour2の小さい方endHour3=endHour=27
endHour3 - startHour3 = 27 - 22 = 5

といった感じで計算するとよいと思います。
分があるのならstart日を起点としたトータル分で計算し時間に戻すと良いと思います。
引用返信 編集キー/
■91337 / inTopicNo.10)  Re[7]: TimeSpan で指定した時間の一部を判定して取得したい
□投稿者/ Jitta (444回)-(2019/06/17(Mon) 09:00:54)
TimeSpanは文字通り期間なので、
TimeSpan.Parse(“3:00”) は「3時」ではなく「3時間」ですよ。
日にちも含めてDateTimeに記録して引き算したら、
ちゃんとTimeSpanがでます。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ