簡體   English   中英

當前時間是否在范圍內

[英]Is current time within range

我知道這個問題已經被問過很多次了,但是我的想法有點曲折。 工作中有許多不同的班次,我有兩個字符串shiftStartshiftEnd (例如分別為“ 6:00:00 PM”和“ 03:00:00 AM”)。 這代表從中午到早晨。 我正在嘗試創建一個告訴我DateTime.Now是否在此時間段內的函數。

注意: 班次可以是任何東西 ...從早上到中午,從中午到早上, 沒有固定的持續時間(例如8個小時)。

static bool NowWithinShiftTime("6:00:00 PM", "03:00:00 AM")

以下是我嘗試過的內容,但是無論我做什么,我似乎都找不到邏輯...請幫助我...

static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
    {
        DateTime startDate;
        DateTime endDate;
        DateTime now = DateTime.Now; 

        TimeSpan startTime = DateTime.Parse(shiftStart).TimeOfDay;
        TimeSpan endTime = DateTime.Parse(shiftEnd).TimeOfDay;

        if (startTime < endTime) // same day
        {
            startDate = new DateTime(now.Year, now.Month, now.Day) + startTime;
            endDate = new DateTime(now.Year, now.Month, now.Day) + endTime;
        }
        else // next day
        {
            startDate = new DateTime(now.Year, now.Month, now.AddDays(-1).Hour) + startTime;
            endDate = DateTime.Today.AddDays(1) + endTime;
        }
        if (now >= startDate && now <= endDate)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

您可以堅持使用TimeSpan

static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
    TimeSpan startTime = DateTime.Parse(shiftStart).TimeOfDay;
    TimeSpan endTime = DateTime.Parse(shiftEnd).TimeOfDay;
    TimeSpan now = DateTime.Now.TimeOfDay;

    if (startTime < endTime)
        return now >= startTime && now <= endTime;
    else
        return now >= startTime || now <= endTime;
}

首先,使所有業務邏輯只處理與時間相關的類型。 (我個人將Noda Time庫及其LocalTime類型用於此工作,但是...)解析可以在調用代碼中進行。

邏輯很簡單:如果“結束時間”實際上早於“開始時間”,則只需將兩者進行切換並將結果取反即可。 畢竟,您只是將日期分為“輪班時間”和“非輪班時間” ...,只要“凌晨3點”到“ 8pm”是“關閉”,則將(例如)從8pm轉變為“ on”。

例如:

public bool NowWithinShiftTime(TimeSpan startTimeOfDay, TimeSpan endTimeOfDay)
{
    if (startTimeOfDay > endTimeOfDay)
    {
        return !NowWithinShiftTime(endTimeOfDay, startTimeOfDay);
    }
    TimeSpan now = DateTime.Now.TimeOfDay;
    return startTimeOfDay <= now && now < endTimeOfDay;
}

筆記:

  • 我故意將其設置為半封閉式,因為它通常適合於間隔,因此,如果您有相鄰的間隔,則任何給定的值都將恰好等於1。 精確檢查您想要什么,盡管它僅與每天的這兩個確切時間點相關。
  • 該代碼目前很難測試:我鼓勵您將“時鍾”的概念抽象到接口中,以便可以使用偽造的時鍾進行測試。 (Noda Time為您執行此操作,並提供適當的FakeClock 。)

我相信您在那里90%:

static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
    DateTime startDate;
    DateTime endDate;
    DateTime now = DateTime.Now; 

    TimeSpan startTime = DateTime.Parse(shiftStart).TimeOfDay;
    TimeSpan endTime = DateTime.Parse(shiftEnd).TimeOfDay;

    if (startTime < endTime) // same day
    {
        startDate = DateTime.Today + startTime;
        endDate = DateTime.Today + endTime;
    }
    else // next day
    {
        startDate = DateTime.Today  + startTime;
        endDate = DateTime.Today.AddDays(1) + endTime;
    }
    if (now >= startDate && now <= endDate)
    {
        return true;
    }
    else
    {
        return false;
    }
}

這是一個顯示效果的ideone: http ://ideone.com/rdb867

這應該工作

static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
   DateTime now = DateTime.Now;
   DateTime startDate = DateTime.Parse(shiftStart);
   DateTime endDate = DateTime.Parse(shiftEnd);

   if (endDate < startDate)
   {
        endDate = endDate.AddDays(1);
   }

   return now >= startDate && now <= endDate;
}

這應該工作:

bool IsWithinTimeRange(DateTime dateToCompare, DateTime startDate, DateTime endDate)
{
    TimeSpan timeToCompare = dateToCompare.TimeOfDay;
    TimeSpan start = startDate.TimeOfDay;
    TimeSpan end = endDate.TimeOfDay;

    if (start < end)
        return timeToCompare >= start && timeToCompare <= end;
    else
        return !(end < timeToCompare && timeToCompare < start);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM