3

指定された時間範囲に該当するデータベース内のレコードのみを更新するジョブ/スケジューラを実行する必要があります。私の場合、時間範囲は午前 3 時 30 分から翌日の午前 1 時 30 分までです。したがって、この時間枠で、ジョブはレコードを更新する必要があります。この時間間隔を取得するために、TimeOfDay() 関数を使用していますが、現在の時刻が 6.00 AM の場合、bcoz が失敗し、「currentTime <= todaysJob.ENDTIME.Value.TimeOfDay」が false を返しています。以下のコードを使用して確認しています

     var currentTime = DateTime.Now.TimeOfDay;
     if (currentTime > todaysJob.STARTTIME.Value.TimeOfDay && 
          currentTime <= todaysJob.ENDTIME.Value.TimeOfDay)
            {
                // Do logic
            }
4

4 に答える 4

1
        bool endTomorrow = true;

        DateTime taskDate = new DateTime(2012, 08, 31);

        TimeSpan Start = new TimeSpan(03, 30, 00);
        TimeSpan End = new TimeSpan(01, 30, 00);

        DateTime currentTime = DateTime.Now;

        bool flag = false;

        if (currentTime.TimeOfDay >= Start)
        {
            if (endTomorrow)
            {
                flag = currentTime.Date <= taskDate || (currentTime.Date == taskDate.AddDays(1) && currentTime.TimeOfDay < End);
            }
            else
            {
                flag = currentTime.TimeOfDay < End;
            }
        }

        if (flag)
        {
            //do the task
        }

編集

だから私は追加しました:

  1. タスクを翌日に終了するかどうかを決定するブールフラグ
  2. タスクの日付を示す日時変数(taskDate)

StartとEndはtodaysJob.STARTTIMEとtodaysJob.ENDTIMEに等しいので、DBからそのまま取得します。

編集

あなたがこのようなあなたの仕事を持つことができれば:

public class Job
{
    public TimeSpan STARTTIME;
    public TimeSpan ENDTIME;
    public DayOfWeek taskDayOfWeek;
    public bool IsEndingTommorow;

    public bool IsTomorrow(DayOfWeek d)
    {
        if (d == DayOfWeek.Sunday)
            return taskDayOfWeek == DayOfWeek.Saturday;
        else
            return d <= taskDayOfWeek;
    }
}

その後、あなたはすることができます

        DateTime currentTime = DateTime.Now;

        bool flag = false;

        if (currentTime.TimeOfDay >= todaysJob.STARTTIME)
        {
            if (todaysJob.IsEndingTommorow)
            {
                flag = currentTime.DayOfWeek == todaysJob.taskDayOfWeek || (todaysJob.IsTomorrow(currentTime.DayOfWeek) && currentTime.TimeOfDay < todaysJob.ENDTIME);
            }
            else
            {
                flag = currentTime.TimeOfDay < todaysJob.ENDTIME;
            }
        }

        if (flag)
        {
            //do the task
        }

編集

コードをもう一度編集しました:DayOfWeek列挙型の問題を回避するためのメソッドを追加しました

于 2012-08-31T04:56:59.973 に答える
1

Time Period Library for .NETを使用して、ある瞬間が複数の期間に分類されるかどうかを判断できます。

// ----------------------------------------------------------------------
public bool CheckDateBetweenDatesSample()
{
  DateTime now = DateTime.Now;
  TimePeriodCollection periods = new TimePeriodCollection();
  // read periods (Start/end) from database
  // ...
  periods.Add( new TimeRange( start, end ) );
  return periods.HasIntersectionPeriods( now );
} // CheckDateBetweenDatesSample
于 2012-08-31T08:31:10.447 に答える
0

これを試してください、それは私のために働いています。私が間違っている場合は修正してください。

TimeSpan timeOfDay = DateTime.Now.TimeOfDay;
TimeSpan startTimeToD = startTime.TimeOfDay;
TimeSpan endTimeToD = endTime.TimeOfDay;

if (timeOfDay > startTimeToD || timeOfDay < endTimeToD )
{
      Console.WriteLine("Hello World");
}

timeOfDay = new TimeSpan(2, 30, 00); //testcase
if (timeOfDay > startTimeToD || timeOfDay < endTimeToD )
{
     //will never execute.
}
于 2012-08-31T04:50:19.303 に答える
0

TimeOfDay プロパティは、中間点 (真夜中) からの絶対距離 (経過時間) であるため使用できません。比較に DateTime だけを使用することの何が問題になっていますか? 比較演算子 ( < > <= >=) は、DateTime データ型で完全に機能します。

例:

DateTime currentTime = DateTime.Now;
DateTime startTime = DateTime.AddMinutes(-50D); //in your case this would be a DT todaysJob.STARTTIME.Value
DateTime endTime = DateTime.AddMinutes(50);// in your case this would be a DT todaysJob.ENDTIME.Value

if(currentTime > startTime && currentTime <= endTime)
{
  Console.Write("Works Fine"); //your logic
}
于 2012-08-31T05:28:23.650 に答える