2014-02-07 2 views
0

Я делаю проект Windows, в котором у меня есть два элемента управления DateTimePicker, один для StartDate и другие для EndDate.Как сравнить две даты в datetimepicker

Во время выполнения, когда пользователь выбирает StartDate и EndDate из этих элементов управления, он должен читать текстовый файл (т.е.) log.txt & поиск по строке, получают соответствие обеих этих дат, а также между датами и записью данные в текстовое поле или этикеточной управления

для, например, в лог-файл, данные, как показано ниже:

3/12/2013 2:51:47 PM - ASDASDASD.D20131203145019 4/12/2013 2: 52:23 PM - ASDDFSDSA.C20131203145019 12/12/2012 14:52:37 PM - SDASAFAS_20131203182101.D 6/12/2013 15:17:11 PM - RRRTWEWA_20131203184602.D00 7/12/2013 3:35:32 PM - XBCNXCXCXC.D0120131203153408

если поиск от 5 дек 2013 7 дек 2013, он должен получить:

5/12/2013 2:52:37 PM - SDASAFAS_20131203182101.D 6/12/2013 3:17:11 PM - RRRTWEWA_20131203184602.D00 7/12/2013 3:35:32 PM - XBCNXCXCXC.D0120131203153408

, но до сих пор я получаю:

12/12/2012 14:52:37 PM - SDASAFAS_20131203182101.D 07/12/2013 3:35:32 PM - XBCNXCXCXC.D0120131203153408

Я возвращаю только StartDate & EndDate сопоставляя данные не между данными даты.

Ниже приведены некоторые кодировки я попытался:

try 
{ 
    // ... 

    string FDDate = FD.Date.ToString("M/d/yyyy"); 
    string TDDate = TD.Date.ToString("M/d/yyyy"); 

    string searchstring = EnterFileNameTextbox.Text.ToString(); 
    string searchfromdate = FromDateTimePicker.Value.ToShortDateString(); 
    string searchtodate = ToDateTimePicker.Value.ToShortDateString(); 

    string line; 
    StringBuilder sb = new StringBuilder(); 
    int counter = 0; 

    using (StreamReader file = new StreamReader(@"D:\log.txt")) 
    { 
     while ((line = file.ReadLine()) != null) 
     { 
      if (line.Contains(searchstring) && line.Contains(FDDate)) 
      { 
       sb.AppendLine(line.ToString()); 
       counter++; 
      }      

      else if (line.Contains(searchstring) && !line.Contains(FDDate)) 
      { 
       if (FD.Date < TD.Date) 
       {         
        sb.AppendLine(line.ToString()); 
        counter++; 
        FDDate = FD.Date.AddDays(1).ToShortDateString(); 
       } 
       else if (FD.Date == TD.Date) 
       { 
        FDDate = FD.Date.ToShortDateString(); 
        sb.AppendLine(line.ToString()); 
        counter++; 
       } 
      } 
     } 
    } 

    ResultTextBox.Text = sb.ToString(); 
    CountLabel.Text = counter.ToString(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("The file could not be read"); 
    MessageBox.Show(ex.Message); 
} 

Я не получаю идею сделать петлю.

+0

Либо установите, чтобы время было одинаковым, либо выделите дату в виде строки для пары идей здесь. –

ответ

2

Я бы рекомендовал использовать DateTime.TryParse (doc here) вместо того, чтобы просто преобразовывать. Это позволит вам предоставить правильное форматирование, обработать сбои (конвертировать будет выдавать, если он не работает).

Часть об использовании свойства Date кажется прекрасной, и операторы сравнения будут работать должным образом.

+0

Согласовано, свойство Date должно работать. –

0

Попробуйте использовать здесь типы данных DateTime вместо того, чтобы преобразовывать все в строку. После прочтения строки из файла проанализируйте дату. Предполагая, что он всегда будет первым элементом в файле, и затем через пробел, вы могли бы сделать это с помощью DateTime lineDate = DateTime.Parse(line.Split(" ")[0]);

После того как вы дату из файла в этом формате, и у вас есть DateTime fromDate и DateTime toDate Полученные от ваших дат, вы можете написать if(lineDate >= fromDate && lineDate <= toDate) sb.AppendLine(line);

+0

Кстати: будьте осторожны с принятием культуры в анализе DateTime. Вы принимаете форматы даты в Северной Америке (как и я в ответе), но это не будет работать, если файл журнала использует m/d/yyyy, но пользователь находится в культуре, где дата отформатирована d/m/гггг. Было бы лучше явно указать формат даты, если файл журнала всегда будет в одном формате. –

Смежные вопросы