Как конвертировать dateTimeOffset из хиджры в григорианский, не изменяя текущую культуру потоков? - PullRequest
0 голосов
/ 11 декабря 2018

Когда я получаю значение столбца dateTimeOffset из базы данных, используя EntityFrameworkCore, я получаю значение этого столбца в Hijri , когда CurrentCulture & CurrentUICulture изтекущий поток - арабский (ar-SA).

Я знаю, что если бы я изменил CurrentCulture of CurrentThread перед возвратом этого значения, я бы получил его по григорианскому календарю.

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-UK");

Но как можноЯ возвращаю его как dateTimeOffset в григорианском календаре без изменения CurrentCulture для CurrentThread?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

В первом промежуточном программном обеспечении конвейера я добавил следующий код:

 var cultureInfo = new CultureInfo("ar-SA");
 cultureInfo.DateTimeFormat.Calendar = new GregorianCalendar();
 var requestCulture = new RequestCulture(cultureInfo);
 Thread.CurrentThread.CurrentCulture = requestCulture;
 Thread.CurrentThread.CurrentUICulture = requestCulture;

Теперь дата возвращается в григорианском календаре вместо хиджры.

В противном случае я думаю, что долженконвертировать дату неявно, не полагаясь на CurrentCulture текущего потока.

0 голосов
/ 26 декабря 2018

Ваше утверждение о том, что текущая культура влияет на то, как EF Core создает экземпляр DateTimeOffset, неверно.Типы данных DateTimeOffset и DateTime сами по себе не имеют календаря, и текущая культура потока не влияет на то, как они создаются (если не выполняется синтаксический анализ строки).

Однако некоторые методы экземпляра, такие какas ToString, будет использовать текущую культуру при вызове, если не указано иное.Скорее всего, вы видите строковый вывод, созданный ToString (явно или неявно), и видите текущую культуру потока, влияющую на вывод.

Поэтому просто передайте определенную культуру (часто InvariantCulture)ToString, и вы увидите результат в григорианском календаре.

string myString = myDateTimeOffset.ToString(CultureInfo.InvariantCulture);
0 голосов
/ 11 декабря 2018

Вы можете использовать одну из перегрузок для функции ToString () объекта DateTimeOffset, который принимает параметр IFormatProvider.Таким образом, вы можете представить объект в указанной вами культуре, не изменяя CurrentCulture.

CultureInfo culture = new CultureInfo("en-UK");
string representationUK = yourDateTimeOffset.ToString(culture);

Вы сможете найти больше информации на странице документации Microsoft

...