DateTime
而且DateTimeOffset
没有任何文化。您仅在解析字符串或输出字符串时使用文化信息。在内部,他们始终使用公历存储数据。因此,如果您正在比较DateTime
或DateTimeOffset
值,那么用于显示的日历系统并不重要 - 比较将始终使用它们的公历等价物进行。
你在你的问题中说过:
因此,查询最终会使用 18/05/1834 日期,因此不返回任何值。
如果您正常做事,那将是不正确的。您的数据库中不会有 Hijri 格式的日期。这些仍然是公历,并且比较应该按预期工作。如果由于某种原因您的数据中确实有回历值,那么您在某处通过字符串传递值,这会受到文化的影响。你不应该那样做。
查看此 MSDN 条目中的示例代码。它清楚地表明您需要使用日历对象来获取每个部分的数字等价物,但是没有办法取回代表非公历系统中整个日期的单个非字符串值。
例如:
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;
更新
似乎这个问题与 RavenDB 中的查询有关,并在此处进行了讨论。该问题被追踪到RavenDB 中与文化相关的错误,并在版本 2.5.2715 中修复。