【问题标题】:Indy10 GMTToLocalDateTime issueIndy10 GMTToLocalDateTime 问题
【发布时间】:2015-05-17 06:33:18
【问题描述】:

看来IndyGMTToLocalDateTime在解码日期的时候并没有忽略cmets:

TDateTime dtDate1 = GMTToLocalDateTime("12 Mar 2015 14:03:21 -0000");
TDateTime dtDate2 = GMTToLocalDateTime("Thu, 12 Mar 2015 14:03:20 +0000 (GMT)");
TDateTime dtDate3 = GMTToLocalDateTime("Thu, 12 Mar 2015 14:03:20 +0000 (envelope-from <aaa@bbb.ccc>)");
TDateTime dtDate4 = GMTToLocalDateTime("Thu, 12 Mar 2015 14:03:20 +0000 (aaa@bbb.ccc)");

UnicodeString Dt1 = DateTimeToStr(dtDate1);
UnicodeString Dt2 = DateTimeToStr(dtDate2);
UnicodeString Dt3 = DateTimeToStr(dtDate3);
UnicodeString Dt4 = DateTimeToStr(dtDate4);

前 2 个已正确解码。最后2个不是。 括号中的部分应该被忽略,因为它只是一个注释,但似乎不是。

这是 Indy 中的错误吗? 另外 - 是否有针对 Indy 的错误跟踪器(因为论坛似乎已关闭)?

【问题讨论】:

  • 您从哪里得到这些括号内的内容可能是被忽略的评论的信息? (这让我想起了this announcement :)
  • 在电子邮件标头中允许嵌入 cmets(请参阅 RFC 822 第 3.4.3 节),但在处理标头数据时应该被忽略。所以在这种情况下,调用者有责任在将数据传递给GMTToLocalDateTime()之前剥离cmets。

标签: delphi datetime c++builder indy


【解决方案1】:

GMTToLocalDateTime()(更具体地说,RawStrInternetToDateTime())并不意味着接受或寻找嵌入式 cmets。注释不属于输入,必须事先删除。嵌入式 cmets 是电子邮件的一项功能,但在处理数据时应被忽略(参见 RFC 822 第 3.4.3 节)。

在这种情况下,调用者没有剥离 cmets,并且在检查时间戳是否存在以及是否它使用':''.' 作为小时/分钟/秒之间的分隔符。

整个 Indy 甚至无法识别,更不用说处理标头中嵌入的 cmets。但是,在这种情况下,我对RawStrInternetToDateTime() 做了一个小调整,因此 cmets 不会再混淆时间戳解析(尽管在解析之前剥离 cmets 确实是调用者的责任)。

是的,Indy 有错误跟踪器:

http://code.google.com/p/indyproject
(虽然Google Code is shutting down,所以这个最终会消失)。

http://indy.codeplex.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多