C# 在.NETMF 4.0中解析RFC822日期时间

C# 在.NETMF 4.0中解析RFC822日期时间,c#,datetime,embedded,.net-micro-framework,rfc822,C#,Datetime,Embedded,.net Micro Framework,Rfc822,我有一个用.NETMF编写的应用程序,它要求我能够解析RFC822日期时间 通常情况下,这很容易,但NETMF没有DateTime.parse()方法,也没有某种模式匹配实现,所以我几乎被卡住了 有什么想法吗 编辑:可能需要“智能”解决方案。这很困难的部分原因是所讨论的日期时间有一种倾向,即在其中有额外的空间(但只是有时)。一个简单的子字符串解决方案可能会在某一天起作用,但在第二天datetime在部分之间的某个地方有额外的空间时失败。我无法控制日期时间,它来自NOAA 好的ol'字符串操作:

我有一个用.NETMF编写的应用程序,它要求我能够解析RFC822日期时间

通常情况下,这很容易,但NETMF没有DateTime.parse()方法,也没有某种模式匹配实现,所以我几乎被卡住了

有什么想法吗


编辑:可能需要“智能”解决方案。这很困难的部分原因是所讨论的日期时间有一种倾向,即在其中有额外的空间(但只是有时)。一个简单的子字符串解决方案可能会在某一天起作用,但在第二天datetime在部分之间的某个地方有额外的空间时失败。我无法控制日期时间,它来自NOAA

好的ol'字符串操作:

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

字符串清理(字符串s)
{
如果(s==null)
{
返回null;
}
char[]buffer=新字符[s.Length];
int pos=0;
bool inSpace=true;
对于(int i=0;i
有趣的问题。MF是出了名的纤细,你尝试的99.95%的OSS都无法编译。我真的对这些回复很感兴趣。这很好,但有一件事我忘了提到,我正在解析的日期时间有时会有额外的空间(不要问。这是一个NOAA XML METAR。我不知道WTF)。我有一个PHP解决方案,它可以智能地遍历并尝试找出dt的每个部分。我想如果我做不到这一点,像这样的解决方案是我唯一的选择,尽管我希望NETMF有一个简单的模式匹配类。只需使用字符串来清除所有空格。替换(“,”)空格是唯一的清除器,所以清除它们不是一个选项。这只会使问题变得更糟,如果没有适当的模式匹配实现,这可能是不可能的。等等,我明白你的意思了。是的,这也可能是一个选项。您可能需要添加一些错误检查,以确保经过清理的字符串确实是正确的格式。另外,不要忘记调整时区偏移的
结果。如果我的代码真的包含所有有效输入,或者例如,
+0000
也可以表示为
UTC
GMT
,请查看规范。在这种情况下,我知道字符串将始终以+0000格式表示。我肯定会扩展这个功能,但我所需要的只是朝着正确的方向猛推一下,你的帖子肯定给了我:)再次感谢。
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);
}