如何检查DateTime.Now是否在两个给定的DateTimes之间仅用于时间部分?

对于我的应用程序,我需要知道Now()是否介于两个值之间。

用户可以设置开始时间和结束时间,这样他就不会被通知打扰(例如在夜间)。

因此,如果有两个TimePicker (开始和结束时间),用户可以设置。

假设用户将StartTime设置为22:00 07:00EndTime设置为07:00 (这将覆盖夜晚)。

如何检查DateTime.Now是否在选定的开始和结束时间之间?

编辑:我只希望这与小时和分钟部分一起使用。 因此,如果用户设置开始和结束时间,这应该适用于每晚。

首先,您需要将所有内容转换为相同的单位(我们将使用TimeSpan ),然后您需要查看开始时间是否跨越午夜,最后根据该检查的结果进行比较:

 // convert everything to TimeSpan TimeSpan start = new TimeSpan(22, 0, 0); TimeSpan end = new TimeSpan(07, 0, 0); TimeSpan now = DateTime.Now.TimeOfDay; // see if start comes before end if (start < end) return start <= now && now <= end; // start is after end, so do the inverse comparison return !(end < now && now < start); 

这是为您完成的function:

 bool TimeBetween(DateTime datetime, TimeSpan start, TimeSpan end) { // convert datetime to a TimeSpan TimeSpan now = datetime.TimeOfDay; // see if start comes before end if (start < end) return start <= now && now <= end; // start is after end, so do the inverse comparison return !(end < now && now < start); } 

你会称之为:

 bool silenceAlarm = TimeBetween(DateTime.Now, StartTime.Value, EndTime.Value); 

由于你只收集两次没有日期,你需要弄清楚这两次是否是同一天。 如果将StartTimeEndTimeNow放入TimeSpans

 if (StartTime > EndTime) { // the range crosses midnight, do the comparisons independently return (StartTime < Now) || (Now < EndTime); } else { // the range is on the same day, both comparisons must be true return StartTime < Now && Now < EndTime; } 
  public static bool isCurrenctDateBetween(DateTime fromDate, DateTime toDate) { DateTime curent = DateTime.Now.Date; if (fromDate.CompareTo(toDate) >= 1) { MessageBox.Show("From Date shouldn't be grater than To Date", "DateRange",MessageBoxButton.OKCancel, MessageBoxImage.Warning); } int cd_fd = curent.CompareTo(fromDate); int cd_td = curent.CompareTo(toDate); if (cd_fd == 0 || cd_td == 0) { return true; } if (cd_fd >= 1 && cd_td <= -1) { return true; } return false; } 
 DateTime nowDate = DateTime.Now; // set these to today + time from time picker DateTime startDate = new DateTime(nowDate.Year, nowDate.Month, nowDate.Day, selectedStart.Hour, selectedStart.Minute, 0); DateTime endDate = new DateTime(nowDate.Year, nowDate.Month, nowDate.Day, selectedEnd.Hour, selectedEnd.Minute, 0); bool isBetween = nowDate < endDate && nowDate > startDate; 

2016年6月8日更新
不确定为什么downvote是合适的,因为这是一个有效的解决方案。 OP确实专门询问了DateTime ,但我确实建议使用TimeSpan来代替@Gabe的答案。

根据我的回答,这是一个工作函数:

 public static bool TimeBetween(DateTime check, DateTime start, DateTime end, bool inclusive = true) { var from = new DateTime(check.Year, check.Month, check.Day, start.Hour, start.Minute, start.Second, start.Millisecond); var to = new DateTime(check.Year, check.Month, check.Day, end.Hour, end.Minute, end.Second, end.Millisecond); if (inclusive) return from <= check && to >= check; return from < check && to > check; } 

这是一个工作小提琴: https : //dotnetfiddle.net/vZCXqv 。

完整代码:

 using System; public class Program { public static void Main() { var start = new DateTime(1, 1, 1, 9, 0, 0); var end = new DateTime(1, 1, 1, 17, 0, 0); Console.WriteLine("{0} - Too early", TimeBetween(new DateTime(2014, 1, 1, 08, 59, 59, 999), start, end)); Console.WriteLine("{0} - On start time exclusive", TimeBetween(new DateTime(2014, 1, 1, 09, 00, 00, 000), start, end, false)); Console.WriteLine("{0} - On start time inclusive", TimeBetween(new DateTime(2014, 1, 1, 09, 00, 00, 000), start, end)); Console.WriteLine("{0} - After start time", TimeBetween(new DateTime(2014, 1, 1, 09, 00, 00, 001), start, end)); Console.WriteLine("{0} - Before end time", TimeBetween(new DateTime(2014, 1, 1, 16, 59, 59, 999), start, end)); Console.WriteLine("{0} - On end time inclusive", TimeBetween(new DateTime(2014, 1, 1, 17, 00, 00, 000), start, end)); Console.WriteLine("{0} - On end time exclusive", TimeBetween(new DateTime(2014, 1, 1, 17, 00, 00, 000), start, end, false)); Console.WriteLine("{0} - Too late", TimeBetween(new DateTime(2014, 1, 1, 17, 00, 00, 001), start, end)); } public static bool TimeBetween(DateTime check, DateTime start, DateTime end, bool inclusive = true) { var from = new DateTime(check.Year, check.Month, check.Day, start.Hour, start.Minute, start.Second, start.Millisecond); var to = new DateTime(check.Year, check.Month, check.Day, end.Hour, end.Minute, end.Second, end.Millisecond); if (inclusive) return from <= check && to >= check; return from < check && to > check; } } 

如果当前时间落在时间范围内 ,则查找 Dupe

 DateTime start = new DateTime(2009, 12, 9, 10, 0, 0)); DateTime end = new DateTime(2009, 12, 10, 12, 0, 0)); DateTime now = DateTime.Now; if ((now > start) && (now < end)) { //match found } 

时间跨度再次来自欺骗。

 TimeSpan start = new TimeSpan(10, 0, 0); TimeSpan end = new TimeSpan(12, 0, 0); TimeSpan now = DateTime.Now.TimeOfDay; if ((now > start) && (now < end)) { //match found } 

我使用它,所以你可以直接传递DateTime:

  public static bool TimeBetween(DateTime time, DateTime startDateTime, DateTime endDateTime) { // get TimeSpan TimeSpan start = new TimeSpan(startDateTime.Hour, startDateTime.Minute, 0); TimeSpan end = new TimeSpan(endDateTime.Hour, endDateTime.Minute, 0); // convert datetime to a TimeSpan TimeSpan now = time.TimeOfDay; // see if start comes before end if (start < end) return start <= now && now <= end; // start is after end, so do the inverse comparison return !(end < now && now < start); } 

做直接比较。

if(date> startdate && date