如何检查DateTime.Now是否在两个给定的DateTimes之间仅用于时间部分?
对于我的应用程序,我需要知道Now()
是否介于两个值之间。
用户可以设置开始时间和结束时间,这样他就不会被通知打扰(例如在夜间)。
因此,如果有两个TimePicker
(开始和结束时间),用户可以设置。
假设用户将StartTime
设置为22:00
07:00
, EndTime
设置为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);
由于你只收集两次没有日期,你需要弄清楚这两次是否是同一天。 如果将StartTime
, EndTime
和Now
放入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