쿼리

2013-09-25 10 views
1

나는 기본적으로 다음과 같습니다 쿼리가 있습니다쿼리

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

자,이 의도 지금까지뿐만 아니라 내 응용 프로그램에 아랍어를 추가 이후, 분명히 자신의 달력 시스템으로 일했습니다 Hijri 캘린더를 사용합니다.

어쨌든 24/09/2013과 같은 날짜는 18/05/34 (발명 된 값)와 같습니다.

따라서 쿼리는 18/05/1834 날짜를 사용하므로 결과 값이 반환되지 않습니다.

tl; dr 비 교양 datetime으로 쿼리 할 수 ​​있기를 원합니다. 나는 CultureInvariant를 사용하는 방법 구글을 시도했지만, 모든 솔루션은 내가 날짜가 어떤 문화가없는

답변

1

DateTimeDateTimeOffset를 반환해야합니다 반면로 .toString()를 보여 주었다. 문자열을 파싱하거나 문자열을 출력 할 때 문화 정보 만 사용합니다. 내부적으로는 항상 그레고리력을 사용하여 데이터를 저장합니다. 따라서 DateTime 또는 DateTimeOffset 값을 비교하는 경우 어떤 달력 시스템이 표시에 사용되는지는 중요하지 않습니다. 비교는 항상 그레고리력으로 비교됩니다. 당신은 당신의 질문에

을 말했다 :

따라서, 쿼리가 어떤 값을 반환하지 않습니다 따라서 18/05/1834 날짜를 사용하게하고있다.

정상적으로 수행하는 경우 이는 사실이 아닙니다. 데이터베이스에 Hijri 형식의 날짜가 없을 것입니다. 그것들은 모두 여전히 그레고리 안이 될 것이고 비교는 예상대로 작동해야합니다. 어떤 이유로 든 데이터에 Hijri 값이 실제로있는 경우 문자열을 기준으로 값을 전달하고 문화에 영향을받습니다. 너는 그렇게해서는 안된다.

샘플 코드 in this MSDN entry을 살펴보십시오. 달력 객체를 사용하여 각 부분에 해당하는 숫자를 가져와야하지만 명확하게 비 태양력 달력 시스템에서 전체 날짜를 나타내는 단일 문자열이 아닌 값을 얻는 방법은 없습니다. 코드에서 회교 달력 날짜를 표현하는 더 나은 방법을 원하는 경우에

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

, 당신은 대신 Noda Time 사용을 고려할 수 :

예를 들어

: 문자열로

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

또는, 내장형. 대체 캘린더에 대한 지원이 훨씬 향상되었습니다. 예를 들어 :

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에서 수정되었습니다.