2013-09-25 93 views
1

我基本上是有一個查詢,看起來像這樣:查詢阿拉伯語(回曆)的日期時間

.Where(x=>x.Date < DateTimeOffset.UtcNow) 

現在,這個曾擔任預期,到目前爲止,但因爲還加入阿拉伯文翻譯成我的應用程序,顯然是他們的日曆系統使用稱爲Hijri日曆的東西?

無論如何,日期如24/09/2013看起來像18/05/34(發明價值)。

因此,查詢最終會使用18/05/1834日期,因此不會返回任何值。

tl; dr我希望能夠用非培養日期時間進行查詢。 我試圖谷歌如何使用CultureInvariant,但所有的解決方案表現出的ToString(),而我需要一個日期時間返回

回答

1

DateTimeDateTimeOffset沒有任何文化。解析字符串或輸出字符串時,只能使用文化信息。在內部,他們總是使用公曆來存儲他們的數據。因此,如果您正在比較DateTimeDateTimeOffset值,那麼使用哪種日曆系統進行顯示並不重要 - 比較將始終使用其公曆等值。

你已經在你的問題說:

因此,查詢將最終使用的18/05/1834日期,因此沒有返回值的。

如果你正在做事情,那不會是真的。您的數據庫中不會有Hijri格式的日期。那些將仍然是公曆,比較應該按預期工作。如果出於某種原因,您的數據中實際上擁有Hijri值,那麼您將通過字符串傳遞值,這會受到文化的影響。你不應該那樣做。請看in this MSDN entry。它清楚地表明,您需要使用日曆對象來獲取每個零件的數字等值,但無法取回代表非格里高利日曆系統中整個日期的單個非字符串值。

例如:

DateTime utc = DateTime.UtcNow; 
Calendar cal = new HijriCalendar(); 
int y = cal.GetYear(utc); 
int m = cal.GetMonth(utc); 
int d = cal.GetDayOfMonth(utc); 

,或作爲字符串:

DateTime utc = DateTime.UtcNow; 
var ci = CultureInfo.CreateSpecificCulture("ar-SA"); 
string s = utc.ToString(ci); 

如果你想有一個更好的方式來表示你的代碼回曆日期,你可以考慮使用Noda Time代替內置類型。它有更好的支持替代日曆。例如:

Instant now = SystemClock.Instance.Now; 
CalendarSystem cal = CalendarSystem.GetIslamicCalendar(IslamicLeapYearPattern.Base15, IslamicEpoch.Civil); 
ZonedDateTime zdt = now.InZone(DateTimeZone.Utc, cal); 
LocalDateTime ldt = zdt.LocalDateTime; 

UPDATE

它出現的問題是具體到在RavenDB查詢,並且是discussed here。該問題被追蹤到culture related bug in RavenDB,並在版本2.5.2715中得到修復。