在 .NETMF 4.0 中解析 RFC822-Datetime

Posted

技术标签:

【中文标题】在 .NETMF 4.0 中解析 RFC822-Datetime【英文标题】:Parsing an RFC822-Datetime in .NETMF 4.0 【发布时间】:2011-02-28 11:11:54 【问题描述】:

我有一个用 .NETMF 编写的应用程序,它要求我能够解析 RFC822-Datetime。

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

有什么想法吗?

编辑:可能需要“智能”解决方案。这很困难的部分原因是所讨论的日期时间倾向于在其中包含额外的空格(但只是有时)。一个简单的子字符串解决方案可能有一天会奏效,但当日期时间在各部分之间的某处有额外空间时,下一次会失败。我无法控制日期时间,它来自 NOAA。

【问题讨论】:

有趣的问题。 MF 是出了名的苗条,你尝试的 99.95% 的 OSS 都无法编译。对对此的回复非常感兴趣。 【参考方案1】:

很好的字符串操作:

2010 年 6 月 6 日星期日 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);

【讨论】:

这很好,但我忘记提及的一件事是,我正在解析的日期时间有时会包含额外的空格(不要问。这是一个 NOAA XML METAR。我不知道WTF)。我有一个 php 解决方案,它可以智能地通过并尝试找出每个 dt 是什么部分。我想如果我不能这样做,那么像这样的解决方案是我唯一的选择,尽管我希望 NETMF 甚至有一个简单的模式匹配类。 用 string.Replace(" ", "") 替换所有空格 空格是唯一的分隔符,因此不能将它们全部删除。这只会使问题变得更糟,如果没有适当的模式匹配实现,这可能是不可能的。编辑:哦等等,我明白你的意思了。是的,这也可能是一种选择。 您可能需要添加一些错误检查以确保已清理的字符串确实是正确的格式。另外,不要忘记调整result 的时区偏移量。如果我的代码确实涵盖了所有有效输入,或者例如 +0000 是否也可以表示为 UTCGMT,请查看规范。 在这种情况下,我知道字符串将始终以 +0000 格式表示。我肯定会扩展这个,但我所需要的只是朝着正确的方向猛烈刺激,你的帖子肯定给了我:)再次感谢。

以上是关于在 .NETMF 4.0 中解析 RFC822-Datetime的主要内容,如果未能解决你的问题,请参考以下文章

在 JAVA 中解析 RFC 2822 日期

在 Java 中解析 MIME 发件人 (RFC 822)

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

cf822D(质因子)

HTTP及RFC解析。