3

指定された Time を 2 つの時間の間で比較して、それらの間隔内にあるかどうかを確認しようとしています。たとえば、指定された時間が 00:00 の場合、21:00:00 から 7:00:00 の間にあるかどうかを調べる必要があります。TimeSpan.Compare no lock を試し、時間部分に > または < も使用しました。

例: 与えられた間隔:

7:00:00 to 19:00:00
19:00:00 to 21:00:00
21:00:00 to 7:00:00

比較する時間:

00:00:00 と 01:00:00

どんな助けでも大歓迎です。

更新された質問:

要件は静かで漠然としているようです。要件は、基本的に Time (TimeSpan) を渡し、2 つの TimeSpan 間隔と比較して、それらの間隔に該当するかどうかを確認することです。

たとえば、従業員が以下の異なる時間枠で働く場合、異なる手当を受け取るとします。

日付範囲: 2012-01-01 から 2012-31

19:00:00 to 21:00:00 ($10.00)
21:00:00 to 7:00:00 ($11.00)
7:00:00 to 19:00:00 ($12.00)

従業員の時給を計算するには、従業員が働いているかどうかを確認する必要があります

  1. 期間:2012-01-01 から 2012-31
  2. 上記の時間範囲の間。

それに応じて $ Rate を適用します。

4

6 に答える 6

11

次のような拡張メソッドを自分で作成できます。

public static class TimeExtensions
{
    public static bool IsBetween(this DateTime time, DateTime startTime, DateTime endTime)
    {
        if (time.TimeOfDay == startTime.TimeOfDay) return true;
        if (time.TimeOfDay == endTime.TimeOfDay) return true;

        if (startTime.TimeOfDay <= endTime.TimeOfDay)
            return (time.TimeOfDay >= startTime.TimeOfDay && time.TimeOfDay <= endTime.TimeOfDay);
        else
            return !(time.TimeOfDay >= endTime.TimeOfDay && time.TimeOfDay <= startTime.TimeOfDay);
    }
}
于 2012-05-17T06:46:32.990 に答える
3

次のコード...

static class DateTimeExt {

    public static bool TimeOfDayIsBetween(this DateTime t, DateTime start, DateTime end) {

        var time_of_day = t.TimeOfDay;
        var start_time_of_day = start.TimeOfDay;
        var end_time_of_day = end.TimeOfDay;

        if (start_time_of_day <= end_time_of_day)
            return start_time_of_day <= time_of_day && time_of_day <= end_time_of_day;

        return start_time_of_day <= time_of_day || time_of_day <= end_time_of_day;

    }

}

class Program {

    static void Test(DateTime t, DateTime start, DateTime end) {
        bool falls_within = t.TimeOfDayIsBetween(start, end);
        Console.WriteLine("{0} \t[{1},\t{2}]:\t{3}", t, start, end, falls_within);
    }

    static void Main(string[] args) {

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0));
        Test(new DateTime(2012, 1, 1, 1, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0));

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0));
        Test(new DateTime(2012, 1, 1, 1, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0));

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0));
        Test(new DateTime(2012, 1, 1, 1, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0));

        Test(new DateTime(2012, 05, 17, 00, 00, 00, 00), new DateTime(2012, 05, 17, 20, 00, 00), new DateTime(2012, 05, 18, 08, 00, 00));
        Test(new DateTime(2012, 05, 17, 09, 00, 00, 00), new DateTime(2012, 05, 17, 20, 00, 00), new DateTime(2012, 05, 18, 08, 00, 00));

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 0, 0, 0));

    }

}

...次の結果を出力します。

1/1/2012 12:00:00 AM    [1/1/2012 7:00:00 AM,   1/1/2012 7:00:00 PM]:   False
1/1/2012 1:00:00 AM     [1/1/2012 7:00:00 AM,   1/1/2012 7:00:00 PM]:   False
1/1/2012 12:00:00 AM    [1/1/2012 7:00:00 PM,   1/1/2012 9:00:00 PM]:   False
1/1/2012 1:00:00 AM     [1/1/2012 7:00:00 PM,   1/1/2012 9:00:00 PM]:   False
1/1/2012 12:00:00 AM    [1/1/2012 9:00:00 PM,   1/1/2012 7:00:00 AM]:   True
1/1/2012 1:00:00 AM     [1/1/2012 9:00:00 PM,   1/1/2012 7:00:00 AM]:   True
5/17/2012 12:00:00 AM   [5/17/2012 8:00:00 PM,  5/18/2012 8:00:00 AM]:  True
5/17/2012 9:00:00 AM    [5/17/2012 8:00:00 PM,  5/18/2012 8:00:00 AM]:  False
1/1/2012 12:00:00 AM    [1/1/2012 12:00:00 AM,  1/1/2012 12:00:00 AM]:  True
于 2012-05-17T12:27:13.057 に答える
1

または、それ以上のニーズがある場合は、私のお気に入りのライブラリの 1 つを使用してください。

于 2012-05-17T06:48:55.033 に答える
0
string dt=DateTime.Now.ToShortTimeString();
DateTime presenttime=Convert.ToDateTime(dt);

starttime = starttimepicker.ValueString;
DateTime dtime=Convert.ToDateTime(starttime);

if (dtime > presenttime)
{
   MessageBox.Show("Time cannot be greater than System Time. Please Try Again!", "Do not selecting future time", MessageBoxButton.OK);
            starttimepicker.Value = presenttime;
}
于 2013-11-27T06:03:44.640 に答える
0

timespan が機能しない理由がわかりません。

このサンプルを POC アプリケーションで試したところ、うまくいきました。

 DateTime t1 = DateTime.Now;
    DateTime t2 = DateTime.UtcNow;
    t1.TimeOfDay.CompareTo(t2.TimeOfDay);

これで問題が解決することを願って試してみてください。

于 2012-05-17T06:50:15.073 に答える
0
var time1 = DateTime.Now.TimeOfDay;
var time2 = DateTime.Now.AddDays(1.3).TimeOfDay;
var diff = time2 - time1;

したがって、これは単なる例であり、1.3 日を追加しても同じ時間の答えが得られることを示しています。

于 2012-05-17T06:49:09.363 に答える