我基本上有一个如下所示的查询:
.Where(x=>x.Date < DateTimeOffset.UtcNow)
现在,到目前为止,这已经按预期工作了,但是由于我的应用程序中也添加了阿拉伯语,显然他们的日历系统使用的是Hijri日历?
无论如何,日期如24/09/2013看起来像18/05/34(发明价值)。
因此,查询将最终使用18/05/1834日期,因此不返回任何值。
tl; dr我希望能够使用非文化日期时间进行查询。 我试图谷歌如何使用CultureInvariant,但所有解决方案显示.ToString()而我需要返回日期时间
答案 0 :(得分:1)
DateTime
和DateTimeOffset
没有任何文化。您只在解析字符串或输出字符串时使用文化信息。在内部,他们总是使用公历来存储他们的数据。因此,如果您要比较DateTime
或DateTimeOffset
值,那么用于显示的日历系统无关紧要 - 比较将始终使用其格里高利等效值。
你在问题中说过:
因此,查询将最终使用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);
如果您想在代码中更好地表示Hijri日历日期,可以考虑使用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中查询,并且是discussed here。该问题被追踪到culture related bug in RavenDB,并在2.5.2715版本中修复。