2010-06-06 77 views
4

我已经写在.NETMF一个应用程序,需要我能够解析RFC822,日期时间。解析RFC822,日期时间在.NETMF 4.0

通常情况下,这将是容易的,但NETMF没有DateTime.parse()方法,也不具有某种匹配的实现模式的,所以我非常坚持。

任何想法?

编辑:很可能需要“智能”的解决方案。部分原因很难,就是所讨论的日期时间有一种倾向,即有时候会有额外的空间。一个简单的子字符串解决方案可能有一天会工作,但当日期时间在部分之间有额外的空间时会失败。我无法控制日期,它来自NOAA。

+0

有趣的问题。 MF非常渺茫,而你尝试的OSS的99.95%将无法编译。真正感兴趣的是对此的回复。 – 2010-06-06 20:13:59

回答

4

好醇”字符串操作:

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

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); 
} 
+0

这很好,但我忘记提及的一点是,我已经知道我解析的日期时间有时会有额外的空格(不要问,它是NOAA XML METAR,我不知道WTF)。我在PHP中有一个解决方案,可以智能地通过并试图找出每个dt的部分。我想如果我不能这样做,像这样的解决方案是我唯一的选择,但我希望NETMF甚至有一个简单的模式匹配类。 – chris12892 2010-06-06 20:20:17

+0

只需使用string.Replace(“”,“”)zap所有空格 – 2010-06-06 20:24:54

+0

空格是唯一的删除符,因此将它们全部切换不是选项。这只会使问题变得更糟,如果没有适当的模式匹配实现,也许就不可能。 编辑:哦,等等,我明白你的观点。是的,这也可能是一个选择。 – chris12892 2010-06-06 20:32:41