【问题标题】:What does strptime do with the information it reads/converts?strptime 如何处理它读取/转换的信息?
【发布时间】:2011-10-28 14:02:56
【问题描述】:

strptime的规范:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html

对可能的转换规范以及它们需要什么输入非常清楚。但是,似乎没有关于此函数如何将结果存储在struct tm 中的规范。如果多个说明符读取部分或全部冲突的数据会发生什么。一个简单的例子是同时存在%m%b(甚至重复%m's)读取冲突的月份,但也许一个更有趣的例子是%d(一个月中的日期)和%a (星期几)冲突。哪个优先? strptime 甚至应该确保struct tm 中的输出一致,还是只是将字段存储为已读? %W(一年中的一周)之类的某些内容在 struct tm 中没有直接表示,因此我认为它们必须导致生成基于其他字段的派生输出,但不清楚何时适用。

我意识到,由于规范似乎缺乏,我可能会要求一个根本不存在的答案,但可以表征有用答案的事情是:

  • 标准化函数所基于的历史实现的行为。
  • 相关缺陷报告的引用
  • 该主题过去讨论的链接(邮件列表、错误跟踪器、usenet 等)
  • 时间解析的其他相关标准

【问题讨论】:

    标签: c posix standards-compliance strptime


    【解决方案1】:

    附加字段可用于验证日期。验证和验证,您可以将字符串转换为一系列重新表示日期的数字,然后您必须验证所有这些数字是否都引用了一个正确的日期,例如星期几是正确的,如果日期无效,则 strptime 返回 NULL

    【讨论】:

    • 所以strptime 转换的所有内容都必须一致,但不一定完整
    • @R.. 这就是我的合理行为。显然有些实现不需要验证一致性,只返回垃圾ala GIGO。
    • 如果派生值不是一致性问题,该怎么办?例如,如果我阅读了年份和年份,我是否可以期望能够在月份、月份和星期几字段中找到有意义的值,或者只能在 -年份和年份字段?当然,如果省略年份,strptime 无法提供任何内容,除了它读取的年份值...
    • @R.. 选项要么是 0(纪元的开始),要么取当前时间的值。因此,如果您提供“星期五”,它将假定为 2011 年。但是 man strptime 显示它仅设置您提供的值,因此是第三种选择。
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2020-11-13
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多