2013-11-15 38 views
0

我正在提醒應用程序。應用程序在數據庫中存儲提醒日期,時間和DateLastShown(在不同的字段中)並將其提取出來以執行檢查。與DateTime.ParseExact錯誤

所有日期均爲「d/MM/yyyy」格式。我的問題是,當我從數據庫中提取日期並嘗試存儲回日期時間格式時,它們仍然以「M/d/yyyy」格式顯示,這不是應用程序需要的格式。

我基本上需要從數據庫中提取值做一些檢查,以確定是否應該顯示提醒並執行此操作。這似乎相當直接,也許我犯了一些小錯誤。

下面是我的意見代碼。 任何幫助真的很感激。

public void CheckReminders() 
    { 
     IQueryable<Reminder> reminders; 
     DateTime reminderDate; 
     DateTime reminderTime; 
     DateTime reminderLastShown; 
     DateTime todayDate; 
     DateTime timeNow;    

     while (true) 
     { 
      try 
      { 
       db = new StudioManagementEntities(); 
       reminders = from r in db.Reminders 
          select r; 

       foreach (Reminder r in reminders) 
       { 
        if (r.Enabled == 1) 
        { 
         if (r.Recurring == 1) 
         {        
          // This is the code i was using before when the date was in "M/d/yyyy" format 
          // which seems to be default. 
          reminderTime = DateTime.Parse(r.Time); 
          timeNow = DateTime.Parse(DateTime.Now.ToLongTimeString()); 

          if (r.DateLastShown != DateTime.Today.ToShortDateString() && timeNow >= reminderTime) 
          { 
           FrmReminder frmReminder = new FrmReminder(r.Id, true); 
           frmReminder.ShowDialog(); 
           r.DateLastShown = DateTime.Today.ToShortDateString();                 
          } 
         } 
         else 
         { 
          // Now i need to pass in "d/M/yyyy" format but the 
          // code seems to return in "M/d/yyyy" format.  

          reminderDate = DateTime.ParseExact(r.Date, "d/MM/yyyy", null); 
          // Even this returns in wrong format 
          reminderDate = DateTime.ParseExact("24/01/2013", "d/MM/yyyy", null);       
          // Have tried with CultureInfo.InvariantCulture too. 
          MessageBox.Show(reminderDate.ToString()); 

          return; 

          if (
           r.DateLastShown != DateTime.Today.Date.ToShortDateString() //&& 
           //r.Date == DateTime.ParseExact(DateTime.Today, "d/MM/yyyy", CultureInfo.InvariantCulture).ToString() //&& 
           //now.TimeOfDay.TotalSeconds >= reminderTime.TimeOfDay.TotalSeconds 
           ) 
          { 
           FrmReminder frmReminder = new FrmReminder(r.Id, true); 
           frmReminder.ShowDialog(); 
           r.DateLastShown = DateTime.Today.ToShortDateString();              
          } 
         }        
        }       
       } 

       db.SaveChanges(); 
      }    
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 

      // Check every minute 
      Thread.Sleep(60000); 
     } 
    } 

和DB表。 enter image description here

+0

'Reminder.Time'的數據類型是什麼?當您檢索它時,它的「精確值」是什麼? (不是'reminderTime'的值,而是'r.Time'的值) –

+1

數據庫或Reminder對象中的日期沒有字符串,而是使用日期代替,問題就消失了。 –

+0

@Chris 查看更新。 – SnakeByte

回答

4

如果解析成日期對象沒有被示數了,你只是玩弄你的輸出一個問題,當你調用.ToString().

從文檔:

ToString方法返回當前文化使用的日曆中的日期和 時間的字符串表示形式。

如果你需要比用戶當前區域性設置其他的東西,你可以指定在重載ToString()方法使用格式字符串:

var reminderDate = DateTime.ParseExact("24/01/2013", "d/MM/yyyy", null); 

    MessageBox.Show(reminderDate.ToString("d/MM/yyyy")); 

此外,如別人的意見所指出的,如果可能的話您應該在數據庫中使用日期數據類型,而不是將值存儲爲字符串。

+0

非常感謝。在將來,我一定會在數據庫中使用DateTime類型。祝你有美好的一天。 – SnakeByte