2016-07-11 167 views
0

我有一個日期範圍來這樣doen't檢查,

包含日期範圍

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

但在下面的代碼它裏面的回報作爲一個假。

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

根據您自己的數據,它也不包含。在查看字符串'07/11/2016'與'7/11/2016'不同時' –

+3

@ AllanS.Hansen:這大概是爲什麼有「TrimStart」調用,雖然這似乎是一個非常糟糕的做事方式對我來說,因爲它不會處理「07/08/2016」。 –

+0

@JonSkeet那麼更好的方法是什麼? – TechGuy

回答

3

白色空間問題。您可以使用trim()和「2016年7月11日」將是「2016年7月11日」

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' }))) 
    { 

    } 
6

立即問題是,你的分割字符串ActualReleaseDates後,沒有的"7/11/2016"的條目。 ..相反,有一個" 7/11/2016"的條目...注意空間。

但更根本的是,剛剛修剪的NewsReleasedDate開始如果值是一樣的東西「2016年7月8日」 ......不會幫助你應該做的是處理這些值的日期,而不是作爲字符串:

  • 分割ActualReleaseDates用逗號,然後分析每個值以適當的形式(我懷疑是M/d/yyyy),使你得到一個List<DateTime>(修剪空白之後)。
  • 解析NewsReleasedDate在適當的格式,我懷疑是MM/dd/yyyy,所以你得到DateTime
  • 查看第一步的列表中是否出現第二步的解析值。

(我個人推薦使用Noda Time和解析,以LocalDate值,但我有偏見......)

從根本上說,你想看到一個日期是否在列表中出現日期 ...因此,請確保儘早將您的數據轉化爲最合適的表示。理想情況下,避免使用此串在所有 ......我們不知道你的數據來的,但如果它在另一個代表開始了和被轉換成文本,看看你是否能避免這種轉換。

+0

@TechGuy:不,恐怕我已經有足夠多*我的盤子專注於我最擅長的(語言功能)。這個對話現在是*方式*脫離主題。我建議我們在這裏刪除我們的評論... –

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.ParseExact。

1

你可以做這樣的查詢之前Prase爲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); 
0

它因爲返回false在NewsReleasedDate中存儲的日期07/11/2016存儲爲開頭爲'0'的字符串。並且在ActualReleaseDates字符串中,','和數字之間有空格。

嘗試重寫theese字符串是這樣的:

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類來做這種比較。