2010-06-06 28 views
4

J'ai une application écrite en .NETMF qui nécessite que je puisse analyser une RFC822-Datetime.Analyse d'une RFC822-Datetime dans .NETMF 4.0

Normalement, ce serait facile, mais NETMF n'a pas de méthode DateTime.parse(), et il n'a pas non plus d'implémentation de mise en correspondance de modèles, donc je suis plutôt bloqué.

Des idées?

EDIT: Des solutions "intelligentes" sont probablement nécessaires. Une partie de la raison pour laquelle cela est difficile est que le datetime en question a tendance à avoir des espaces supplémentaires (mais seulement parfois). Une solution de sous-chaîne simple peut fonctionner un jour, mais échouer la suivante lorsque le datetime dispose d'un espace supplémentaire entre les parties. Je n'ai pas de contrôle sur le datetime, il vient de la NOAA.

+0

question intéressante. MF est notoirement mince, et 99,95% d'un OSS que vous essayez de ne pas compiler. Vraiment intéressé par les réponses à cela. –

Répondre

4

manipulation bonne chaîne « ol:

 
Sun, 06 Jun 2010 20:07:44 +0000 
      1   2   3 

string x = Sanitize(" Sun, 06 \t Jun 2010 \r\n 20:07:44 +0000 "); 

int day = int.Parse(x.Substring(5, 2)); 
int month = Array.IndexOf(months, x.Substring(8, 3)) + 1; 
int year = int.Parse(x.Substring(12, 4)); 

int hour = int.Parse(x.Substring(17, 2)); 
int minute = int.Parse(x.Substring(20, 2)); 
int second = int.Parse(x.Substring(23, 2)); 

int offsetSgn = (x[26] == "-") ? -1 : 1; 
int offsetHour = int.Parse(x.Substring(27, 2)); 
int offsetMinute = int.Parse(x.Substring(29, 2)); 

DateTime result = new DateTime(year, month, day, hour, minute, second, 0); 
TimeSpan offset = new TimeSpan(offsetHour, offsetMinute, 0); 

// TODO: add offset... 

avec

string[] months = new string[12]; 
months[0] = "Jan"; 
months[1] = "Feb"; 
months[2] = "Mar"; 
months[3] = "Apr"; 
months[4] = "May"; 
months[5] = "Jun"; 
months[6] = "Jul"; 
months[7] = "Aug"; 
months[8] = "Sep"; 
months[9] = "Oct"; 
months[10] = "Nov"; 
months[11] = "Dec"; 

et

string Sanitize(string s) 
{ 
    if (s == null) 
    { 
     return null; 
    } 

    char[] buffer = new char[s.Length]; 
    int pos = 0; 
    bool inSpace = true; 

    for (int i = 0; i < s.Length; i++) 
    { 
     if (s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') 
     { 
      if (!inSpace) 
      { 
       buffer[pos] = ' '; 
       pos++; 
       inSpace = true; 
      } 
     } 
     else 
     { 
      buffer[pos] = s[i]; 
      pos++; 
      inSpace = false; 
     } 
    } 

    return new string(buffer, 0, pos); 
} 
+0

C'est bien, mais une chose que j'ai oublié de mentionner est que le datetime que j'analyse a parfois des espaces supplémentaires (Ne demandez pas, c'est un METAR XML NOAA, je n'ai aucune idée de WTF). J'avais une solution en PHP qui allait intelligemment passer et essayer de comprendre quelle partie de chaque dt était. Je suppose que si je ne peux pas faire cela, une solution comme celle-ci est ma seule option, même si je souhaite que NETMF ait même une simple classe de correspondance de modèle. – chris12892

+0

Juste zapper tous les espaces avec string.Replace ("", "") –

+0

Les espaces sont le seul suppresseur, donc zapper tout n'est pas une option. Cela ne fait qu'aggraver le problème, peut-être impossible sans une bonne mise en œuvre de la mise en correspondance des modèles. EDIT: Oh, attends, je vois ce que vous voulez dire. Oui, ça pourrait aussi être une option. – chris12892