2015-07-15 5 views
0

У меня есть дата в строковом формате, исходящее от сервера, который я не могу изменить.конвертировать арабскую строку даты в объект datetime в C#

DateTime приходит в таком формате и на арабском языке:

14-يوليه -2015 4:44:51 م

и я не могу превратить его в объект даты и времени в C#.

Я пробовал это до сих пор.

DateTime latest = Convert.ToDateTime(latestTables.Result.StaticTable[i].dtUpdTime, new CultureInfo("en-US")); 

DateTime latest = DateTime.ParseExact(latestTables.Result.StaticTable[i].dtUpdTime, "dd-t hh:mm:ss yyyy-MMM", CultureInfo.InvariantCulture); 

DateTime latest = Convert.ToDateTime(latestTables.Result.StaticTable[i].dtUpdTime, new CultureInfo("ar-SA")); 

ответ

0

Этот текст переводится как "14 - июля 4:44:51 -2015 м" согласно Google Translate: Google Tranlate Link. Вы можете легко разобрать это с помощью DateTime.ParseExact

Это question может способствовать дальнейшим

+0

нормально, так что вы хотите сказать, что это будет преобразовать его: DateTime.ParseExact (latestTables.Result.StaticTable [я] .dtUpdTime, "дд - MMM чч: мм: сс -yyyy т", CultureInfo.InvariantCulture) ; – Yawar

+0

Нет его не преобразование по вышеуказанному коду – Yawar

+0

Вы преобразовали текст перед запуском функции parseExact? – tichra

1

Попытавшись вставить арабские строки даты в мой ответ я обнаружил, что персонажи иногда заказаны из-за проблемы RTL. В частности, DateTime, отформатированный в формате d-MMMM-yyyy hh:mm:ss tt, будет иметь начальную часть d-, перемещенную до конца (влево), которая является именно тем, как отображается строка в вашем вопросе (например, справа налево: месяц, год, время, AM/PM спецификатор, а затем день, который кажется странным). Поэтому я предполагаю, что ваша строка действительно использует более естественный формат d-MMMM-yyyy hh:mm:ss tt.

Проблема, с которой вы сталкиваетесь, заключается в том, что вам нужно использовать правильный календарь. Вы пытались использовать культуру ar-SA, но календарь по умолчанию для этого - календарь Hirji. Вам нужно использовать григорианский календарь с правильными месячными именами. Чтобы изменить календарь, вам нужно создать новый CultureInfo и выбрать правильный календарь. В вашем случае, кажется, что вы должны использовать «локализованный» календарь с индексом 5 OptionalCalendars собственности:

var cultureInfo = CultureInfo.CreateSpecificCulture("ar-SA"); 
cultureInfo.DateTimeFormat.Calendar = cultureInfo.OptionalCalendars[5]; 

Вы можете разобрать вашу строку, используя этот код (где я создаю строку таким образом, что делает не изменить его, когда я вставить его в браузере):

var dateTimeString = new String(new[] { 
    '1', 
    '4', 
    '-', 
    'ي', 
    'و', 
    'ل', 
    'ي', 
    'و', 
    '-', 
    '2', 
    '0', 
    '1', 
    '5', 
    ' ', 
    '0', 
    '4', 
    ':', 
    '4', 
    '4', 
    ':', 
    '5', 
    '1', 
    ' ', 
    'م' 
}); 
var dateTime = DateTime.Parse(dateTimeString, cultureInfo); 

Полученный DateTime является:

 
2015-07-14T16:44:51 

Если вы хотите использовать DateTime.ParseExact формат d-MMMM-yyyy hh:mm:ss tt:

var dateTime = DateTime.ParseExact(dateTimeString, "d-MMMM-yyyy hh:mm:ss tt", cultureInfo); 

Вы должны также рассмотреть возможность использования DateTime.TryParse или DateTime.TryParseExact для лучшего потока кода, если вы столкнулись с недопустимой отформатированной строкой.

+0

'+ 1' для ваших усилий. Я не думал, что каждый персонаж в проводнике unicode или что-то еще и помещает их в конструктор строк в виде массива. Хороший. –

Смежные вопросы