2015-07-15 1 views
0

J'ai l'heure de date en format de chaîne venant du serveur que je ne peux pas changer.convertir la chaîne de date arabe en objet datetime dans C#

DateTime vient dans ce format et en arabe:

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

et je suis incapable de le convertir en objet datetime en C#.

J'ai essayé cela jusqu'à présent.

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")); 

Répondre

0

Ce texte traduit à "14 - Juillet 04:44:51 -2015 m", selon google traduction: Google Tranlate Link. Vous pouvez facilement analyser cela en utilisant DateTime.ParseExact

Cette question pourrait contribuer au

+0

ok donc vous voulez dire que cela va convertir: DateTime.ParseExact (latestTables.Result.StaticTable [i] .dtUpdTime, "dd - MMM hh: mm: ss -yyyy t", CultureInfo.InvariantCulture) ; – Yawar

+0

Non sa conversion par le code ci-dessus – Yawar

+0

Avez-vous convertir le texte avant d'exécuter la fonction parseExact? – tichra

1

Après avoir essayé de coller des chaînes de date arabes dans ma réponse que je l'ai découvert que les caractères sont parfois réorganisés en raison de problèmes RTL. En particulier, un DateTime formaté en utilisant le format d-MMMM-yyyy hh:mm:ss tt aura la partie initiale d- déplacée vers la fin (à gauche), ce qui correspond exactement à la chaîne de votre question (par ex. De droite à gauche: mois, année, heure, AM/PM spécificateur et puis jour qui semble bizarre). Donc, je suppose que votre chaîne utilise vraiment le format plus naturel d-MMMM-yyyy hh:mm:ss tt.

Le problème que vous rencontrez est que vous devez utiliser le bon calendrier. Vous avez essayé d'utiliser la culture ar-SA mais le calendrier par défaut est un calendrier Hirji. Vous devez utiliser un calendrier grégorien avec les noms de mois corrects. Pour changer le calendrier, vous devez créer un nouveau CultureInfo et choisir le bon calendrier. Dans votre cas, il semble que vous devez utiliser le calendrier « Localized » à l'indice 5 de la propriété OptionalCalendars:

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

Vous pouvez ensuite analyser votre chaîne en utilisant ce code (où je crée la chaîne d'une manière qui ne change pas quand je le coller dans mon navigateur):

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

Le DateTime résultant est:

 
2015-07-14T16:44:51 

Si vous souhaitez utiliser DateTime.ParseExact le format est d-MMMM-yyyy hh:mm:ss tt:

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

Vous devriez également envisager d'utiliser DateTime.TryParse ou DateTime.TryParseExact pour un meilleur flux de code si vous rencontrez une chaîne au format non valide.

+0

'+ 1' pour votre effort. Je n'étais pas vraiment penser à obtenir tous les caractères dans un explorateur Unicode ou quelque chose et les mettre dans un constructeur de chaîne en tant que tableau. Joli. –