C# 包含doen';t签入日期范围
我有一个这样的日期范围,C# 包含doen';t签入日期范围,c#,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是否在实际ReleaseDates内 但在下面的代码中,它返回为false if (ActualReleaseDates.Split(',
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是否在实际ReleaseDates内
但在下面的代码中,它返回为false
if (ActualReleaseDates.Split(',').Contains(NewsReleasedDate.TrimStart(new Char[] { '0' })))
{
//some code here
}
空白问题。您可以使用
trim()
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' })))
{
}
直接的问题是,在拆分ActualReleaseDates
字符串后,没有“7/11/2016”
。。。取而代之的是一个条目“7/11/2016”
。。。注意空格
但更根本的是,如果值类似于“07/08/2016”,那么仅仅调整NewsReleasedDate
的开头将无济于事。。。您应该将这些值处理为日期,而不是字符串:
- 用逗号拆分
ActualReleaseDates
,然后以适当的格式(我怀疑是M/d/yyyy
)解析每个值(在删减空格后),以便得到一个列表
- 以适当的格式解析
NewsReleasedDate
,我怀疑是MM/dd/yyyy
,因此您会得到一个DateTime
- 查看第二步的解析值是否出现在第一步的列表中
(我个人建议使用和解析LocalDate
值,但我有偏见……)
从根本上说,您试图查看一个日期是否出现在日期列表中。。。因此,请确保尽早将数据转换为最合适的表示形式。理想情况下,完全避免使用字符串。。。我们不知道您的数据来自何处,但如果它以另一种表示形式开始并被转换为文本,请查看是否可以避免这种转换。您可以使用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分别解析为当前区域性。如果要指定确切的日期格式,可以使用DateTime.ParseExact。在执行以下查询之前,可以使用DateTime:
(我认为这是比较日期最准确、最有保证的方法)
Func stringToDate=s=>DateTime.ParseExact(s.Trim(),“M/d/yyyy”,
文化信息(不变量文化);
DateTime newReleaseDateTime=stringToDate(NewsReleaseDate);
bool result=ActualReleaseDates.Split(',')。选择(x=>stringToDate(x))
.包含(newReleaseDateTime);
它返回false,因为存储在NewsReleaseDate中的日期为2016年11月7日数据存储为字符串,开头带有“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
变量如下:
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类来进行此类比较。根据您自己的数据,它也不包含在内。查看字符串时,2016年11月7日与2016年11月7日不同。汉森:这大概就是为什么会有“TrimStart”调用,尽管这对我来说似乎是一种非常糟糕的方式,因为它不会处理“2016年8月7日”@JonSkeet那么什么是更好的方法?你能创建一个日期时间数组而不是字符串数组吗?@AllanS.Hansen:同意。我已经添加了一个提到这一点的答案,但还有更大的问题…@TechGuy:不,恐怕我已经有足够多的精力专注于我最擅长的方面(语言功能)。这段对话现在偏离了主题。我建议我们都删除这里的评论。。。