Разбор RFC822-Datetime в .NETMF 4.0 - PullRequest
4 голосов
/ 07 июня 2010

У меня есть приложение, написанное на .NETMF, которое требует, чтобы я мог анализировать RFC822-Datetime.

Обычно это было бы легко, но NETMF не имеет метода DateTime.parse () и не имеет какой-либо реализации сопоставления с образцом, поэтому я в значительной степени застрял.

Есть идеи?

РЕДАКТИРОВАТЬ: "Интеллектуальные" решения, вероятно, необходимы. Одной из причин этого является то, что рассматриваемая дата-время имеет тенденцию иметь в себе дополнительные пробелы (но только иногда). Простое решение для подстрок может работать в один день, но в следующий раз не удастся, если между датой и временем есть дополнительное пространство. У меня нет контроля над временем и датой, это из NOAA.

1 Ответ

4 голосов
/ 07 июня 2010

Хорошие манипуляции со строкой:

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...

с

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

и

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);
}
...