Question

J'ai une demande écrite en .NETMF qui exige que je sois capable d'analyser un RFC822-Datetime.

Normalement, ce serait facile, mais NETMF ne dispose pas d'une méthode DateTime.Parse (), ni avoir une sorte de mise en œuvre de correspondance de motif, donc je suis un peu coincé.

Toutes les idées?

EDIT: solutions "intelligentes" sont probablement nécessaires. Une partie de la raison pour laquelle il est difficile est que le datetime en question a tendance à avoir des espaces supplémentaires dans (mais parfois seulement). Une solution simple pourrait fonctionner sous-chaîne un jour, mais ne parviennent pas suivant lorsque le datetime a une part de l'espace supplémentaire entre les parties. Je n'ai pas le contrôle de la datetime, il est de la NOAA.

Était-ce utile?

La solution

Bonne manipulation string ol »:

Sun, 06 Jun 2010 20:07:44 +0000
          1         2         3
0123456789012345678901234567890
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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top