包含在日期范围内检查

时间:2016-07-11 06:49:32

标签: c#

我的日期范围是这样的,

string ActualReleaseDates ="7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
string NewsReleasedDate ="07/11/2016";

我想检查NewsReleaseDate是否在ActualReleaseDates

但是在下面的代码中它返回为false。

if (ActualReleaseDates.Split(',').Contains(NewsReleasedDate.TrimStart(new Char[] { '0' })))
{
    //some code here
}

5 个答案:

答案 0 :(得分:6)

立即问题是,在拆分ActualReleaseDates字符串后,没有"7/11/2016"的条目...而是有{{1}的条目} ...注意空间。

但更重要的是,只要修改" 7/11/2016"的开头,如果价值就像“07/08/2016”那么......你应该做什么就是将这些值作为日期处理,而不是作为字符串处理:

  • 用逗号分割NewsReleasedDate,然后以适当的格式解析每个值(修剪空格后)(我怀疑是ActualReleaseDates),这样就得到M/d/yyyy
  • 以适当的格式解析List<DateTime>,我怀疑是NewsReleasedDate,因此您获得了MM/dd/yyyy
  • 查看第二步中解析后的值是否出现在第一步的列表中。

(我个人建议使用Noda Time并解析为DateTime值,但我有偏见......)

从根本上说,您正在尝试查看一个日期是否出现在日期列表中...所以请确保将您的数据转换为最适合的表示形式尽可能早。理想情况下,避免在此中使用字符串 ...我们不知道您的数据来自哪里,但是如果它是从另一个表示开始并且已经转换为文本,看看你是否可以避免这种转换。

答案 1 :(得分:3)

白色空间问题。您可以使用trim()和'7/11/2016'将成为'7/11/2016'

    var ActualReleaseDates = "7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
    var NewsReleasedDate = "07/11/2016";

    var splitActualReleaseDates = ActualReleaseDates.Split(',').Select(x => x.Trim());

    if (splitActualReleaseDates.Contains(NewsReleasedDate.TrimStart(new Char[] { '0' })))
    {

    }

答案 2 :(得分:1)

您可以使用linq将字符串转换为DateTime对象并比较它们而不是字符串

string ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
string NewsReleasedDate ="07/11/2016";

var releaseDates = ActualReleaseDates.Split(',').Select(x => DateTime.Parse(x));
var newsReleased = DateTime.Parse(NewsReleaseDate);

if (releaseDates.Contains(newsReleased))
{
    //some code here
}

请注意,DateTime将分别解析为当前的Culture。如果要指定确切的日期格式,可以使用DateTime.ParseExact。

答案 3 :(得分:1)

在执行查询之前,您可以Prase to DateTime:

(我认为这是比较日期的最准确和最有保证的方法)

Func<string, DateTime> stringToDate = s => DateTime.ParseExact(s.Trim(), "M/d/yyyy", 
                                                        CultureInfo.InvariantCulture);

DateTime newReleaseDateTime = stringToDate(NewsReleasedDate);

bool result = ActualReleaseDates.Split(',').Select(x => stringToDate(x))
                                            .Contains(newReleaseDateTime);

答案 4 :(得分:0)

它返回false,因为存储在NewsReleasedDate中的日期07/11/2016以字符串形式存储,开头为“0”。在ActualReleaseDates字符串中,','和数字之间有空格。

尝试重写这样的字符串:

ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; // white spaces removed.

和这样的变量:

NewsReleasedDate ="7/11/2016"; // 0 removed

这是我的代码示例:

 string ActualReleaseDates = "7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016";
 string NewsReleasedDate = "7/11/2016";
 string[] dates = ActualReleaseDates.Split(',');
 Console.WriteLine(dates.Contains(NewsReleasedDate));

这不是比较日期的最佳方式,您可以使用Date类来进行此类比较。