使用阿拉伯语(回历)日期时间查询

本文关键字:日期 时间 查询 回历 阿拉伯语 | 更新日期: 2023-09-27 18:32:47

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

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

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

无论如何,诸如 24/

09/2013 之类的日期看起来像 18/05/34(虚构的值(。

因此,

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

我希望能够使用非培养日期时间进行查询。我试图用谷歌搜索如何使用文化不变,但所有解决方案都显示.ToString(( 而我需要返回一个日期时间

使用阿拉伯语(回历)日期时间查询

DateTimeDateTimeOffset没有任何文化。 仅在分析字符串或输出字符串时使用区域性信息。 在内部,他们始终使用公历存储数据。 因此,如果您要比较DateTimeDateTimeOffset值,那么使用什么日历系统进行显示并不重要 - 比较将始终与它们的公历等效项进行比较。

你在问题中说过:

因此,

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

如果你正常做事,那就不是真的了。 您的数据库中不会有回历格式的日期。 这些都将仍然是公历的,比较应该按预期工作。 如果出于某种原因,您的数据中确实有回历值,那么您在某个地方通过字符串传递值,这受到文化的影响。 你不应该那样做。

请查看此 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 中修复。