2

我基本上有一个看起来像这样的查询:

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

现在,到目前为止,这已经按预期工作了,但是由于还在我的应用程序中添加了阿拉伯语,显然他们的日历系统使用了一种叫做 Hijri 日历的东西?

无论如何,诸如 24/09/2013 之类的日期看起来像 18/05/34(发明值)。

因此,查询最终会使用 18/05/1834 日期,因此不返回任何值。

tl;博士我希望能够使用非培养日期时间进行查询。我试图用谷歌搜索如何使用 CultureInvariant,但所有解决方案都显示了 .ToString() 而我需要返回日期时间

4

1 回答 1

2

DateTime而且DateTimeOffset没有任何文化。您仅在解析字符串或输出字符串时使用文化信息。在内部,他们始终使用公历存储数据。因此,如果您正在比较DateTimeDateTimeOffset值,那么用于显示的日历系统并不重要 - 比较将始终使用它们的公历等价物进行。

你在你的问题中说过:

因此,查询最终会使用 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 中修复。

于 2013-09-25T16:27:30.273 回答