2017-03-15 66 views
0

我在c#中使用linq.but編寫日期範圍過濾器的代碼,在server.in上獲取像這樣的錯誤,我的本地代碼工作得很好,但在服務器上部署出錯。在c#中字符串未被識別爲有效的DateTime?

在這裏,我嘗試這個代碼:

string fromDate = "15-03-2017"; 
string toDate = "17-03-2017"; 
DateTime FromDate = Convert.ToDateTime(fromDate); 
DateTime ToDate = Convert.ToDateTime(toDate);       
UserList = db.Users 
    .Where(t => DbFunctions.TruncateTime(t.datetime) >= FromDate && DbFunctions.TruncateTime(t.datetime) <= ToDate) 
    .OrderByDescending(a => a.datetime) 
    .ToList(); 

我不知道哪裏是我在這個查詢mistke有任何人知道,那麼請讓我知道如何Ø解決此issue.in本地代碼工作得很好但在服務器上出現錯誤。

+0

這很可能是您的區域設置不同於您的服務器上...所以有三種方法來解決它1 =>更改服務器設置... 2改變web.config。3 =>寫出體面的轉換代碼:) –

+0

使用[Convert.ToDateTime(string,IFormatProvider)](https:// m sdn.microsoft.com/en-us/library/9xk1h71t.aspx)過載。服務器文化與本地機器不同。你很幸運,你得到的錯誤,而不是服務器默默誤讀月份,反之亦然。 – Martheen

+1

這個問題與LINQ沒什麼共同之處,請刪除'linq'標籤。 –

回答

1

您應該確保您的字符串符合ISO 8601格式(日期格式爲yyyy-MM-dd格式)。

string fromDate = "2017-03-15"; 
string toDate = "2017-03-17"; 
DateTime FromDate = Convert.ToDateTime(fromDate); 

或者使用DateTime.ParseExact來指定字符串格式:

string fromDate = "15-03-2017"; 
string toDate = "17-03-2017"; 
DateTime FromDate = 
    DateTime.ParseExact(fromDate, "dd-MM-yyyy", CultureInfo.InvariantCulture) 

注意,您可以儘量避免使用DbFunctions.TruncateTime。第一個條件檢查t.datetime是否來自同一天FromDate或之後:

DbFunctions.TruncateTime(t.datetime) >= FromDate 

它會給同樣的結果,如果你不會截斷時間。如果t.datetime具有更大的日期,那麼在這種情況下,截斷時間不會改變任何事情。如果日期相同,則截斷時間只會將條件結果從'更大'更改爲'等於'。第二個條件是檢查t.datetime是從同一天ToDate或該日之前:

DbFunctions.TruncateTime(t.datetime) <= ToDate 

你會得到相同的結果,如果你檢查t.date是否小於一天旁邊ToDate。因此,查詢將如下所示:

DateTime FromDate = Convert.ToDateTime(fromDate); 
DateTime ToDate = Convert.ToDateTime(toDate).AddDays(1);       
UserList = db.Users 
    .Where(u => u.datetime >= FromDate && u.datetime < ToDate) 
    .OrderByDescending(u => u.datetime) 
    .ToList(); 
+0

你是說我在DateTime()中傳遞這種格式? – coderwill

+0

@Hiren或者像我在第一個例子中那樣將字符串格式更改爲year-month-day,或者如果您不能更改字符串格式,那麼請使用第二個示例並指定您的格式 –

+0

我通過哪種格式可以請讓我知道? – coderwill

5

您使用的方法取決於當前線程的當前文化 - 和系統時區。

在我看來,使用DateTime.ParseExact會更好,並且可能會指定DateTimeStyles值來強制使用UTC。簡單解析:

// Names changed to follow .NET naming conventions 
CultureInfo invariantCulture = CultureInfo.InvariantCulture; 
DateTime fromDateTime = DateTime.ParseExact(fromDate, "dd-MM-yyyy", invariantCulture); 
DateTime toDateTime = DateTime.ParseExact(toDate, "dd-MM-yyyy", invariantCulture); 

指定固定區域性意味着,如果它在非公曆規定,你不小心就會落得解析日期。

請注意,這是一種不尋常的格式 - 如果您可以使用ISO-8601格式,那將會更好。

我還建議如果你正在做大量的日期/時間工作,你會考慮我的Noda Time項目,這使得生活更簡單,無需擔心日期的時區,因爲它只是一個date ...你會將這些字符串解析爲LocalDate值。

+0

可能是ParseExact需要3個參數。我嘗試這一波,但仍然是問題越來越。 – coderwill

+0

'DateTime.ParseExact'需要三個參數,對吧? – currarpickt

+0

@Hiren:固定 - 無論如何都會解決一個單獨的問題(對此有解釋)。 –

1

我認爲你的服務器和本地存在不同的區域。您可以通過使用DateTime.ParseExact來解決此問題。下面給出的例子;編輯您的需求

DateTime dt=DateTime.ParseExact("15-03-2017", "dd-MM-yyyy", CultureInfo.InvariantCulture);

這將工作在所有地區和解決您的問題

+0

仍然錯誤獲取。 – coderwill

1

您是否嘗試過使用的CultureInfo?來自服務器的用戶文化信息,例如我正在使用美國文化信息。

DateTimeFormatInfo usCinfo = new CultureInfo("en-US", false).DateTimeFormat; 
DateTime fromDate = Convert.ToDateTime("12/01/2011", usCinfo) 
+0

還有問題來試試這個波來吧 – coderwill

1

系統上的語言(本地和服務器)可能不同。在解析日期和數字時,應明確提供格式info/culture info/format字符串以避免出現此類問題。有多種方法可以做到這一點,例如一個將你的代碼工作:

string toDate = "17-03-2017"; 
DateTimeFormatInfo formatInfo = new DateTimeFormatInfo(); 
formatInfo.ShortDatePattern = "dd-MM-yyyy"; 
formatInfo.DateSeparator = "-"; 
DateTime ToDate = Convert.ToDateTime(toDate, formatInfo); 

編輯:從您的評論你的問題提供了什麼,它可能是不正確的日期分隔符的問題。這發生在具有英語語言的系統上,無論提供什麼格式字符串,解析日期字符串時,分隔符都設置爲「/」。要克服這一點的一種方式是提供日期是這樣的:"03-17-2017"(提防月日在此之前提供,格式"MM/dd/yyyy"而不是"dd/MM/yyyy"另一種方式是提供日期分隔符:

formatInfo.DateSeparator = "-";

如果這是不是它,那麼問題可能是TruncateTime()

+0

還是錯誤一樣來試試這個波 – coderwill

+0

@Hiren你到底是什麼錯誤?如果它與解析日期無關,那麼它可能是TruncateTime問題或與linq查詢相關的其他內容 – Arie

相關問題