Timespan在if else语句中

问题描述 投票:1回答:2

我有以下代码,我打算用它来检查用户是否在两个datetimepickers之间放置了正确的天数。我在谷歌搜索过,有些帖子说使用var,有人说parse,但仍然无法正常工作,消息框在检查时不会弹出。

我已经通过使用标签作为结果的容器并使用if else语句检查文本是否等于14,15或16来使其工作。它的工作原因我只需要检测它是否为14,15或16,但如果给我一个我需要比较大数字的情况怎么办,我希望我能比现在更好的解决方案。

有人可以请告诉我如何正确比较if else语句中的时间跨度?非常感谢。祝你今天愉快 :)

DateTime dateFrom = from_dtPicker.Value;
DateTime dateTo = to_dtPicker.Value;
TimeSpan DayDifference = dateTo - dateFrom;
double NumberOfDays = DayDifference.TotalDays;

if ((NumberOfDays < 14) && (NumberOfDays > 16)) 
{
    //message box
}

这就是我的奇怪解决方案的意思,

DateTime dateFrom = pp_from_dtPicker.Value;
DateTime dateTo = pp_to_dtPicker.Value;
TimeSpan DayDifference = dateTo - dateFrom;
numofdaysLBL.Text = DayDifference.TotalDays.ToString();

if ((numofdaysLBL.Text != "14") && (numofdaysLBL.Text != "15") && (numofdaysLBL.Text != "16"))
{
        //msgbox
}
c#
2个回答
2
投票

在我看来,你的比较是这里的问题

if ((NumberOfDays < 14) && (NumberOfDays > 16))

NumberOfDays永远不会少于14并且同时超过16。而是反转比较:

if ((NumberOfDays >= 14) && (NumberOfDays <= 16))

编辑:也许我误解了你的要求(正如评论中指出的那样)。如果您想要一个更通用的比较日期解决方案,您可以简单地将代码包装到一个函数中

bool AreDatesClose(DateTime d1, DateTime d2, double minDaysApart, double maxDaysApart)
{
    var timespan = d1 - d2;
    return timespan.TotalDays >= minDaysApart && timespan.TotalDays <= maxDaysApart;
}

1
投票

你可以写一个函数,它会给你NumberOfDays在给定范围之间

public bool IsGivenDateInRange(double numberOfDays, double startDate, double endDate)
{
  return numberOfDays >= startDate && numberOfDays <= endDate;
}

现在在if条件下使用此函数

if(IsGivenDateInRange(NumberOfDays, 14, 16)) //Instead of 14 and 16 you can use any number
{
      //Your logic
}

根据你的问题中的新编辑,如果你想在日期不在这些范围内时显示消息框,那么你可以使用相同的功能但是否定

if(!IsGivenDateInRange(NumberOfDays, 14, 16)) //Instead of 14 and 16 you can use any number
{
      //MessageBox.Show();
      //Your logic
}
© www.soinside.com 2019 - 2024. All rights reserved.