2010-06-06 78 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