下面的程序演示了asctime
的使用。
#include <stdio.h>
#include <time.h>
int main(void) {
struct tm broken_down;
broken_down.tm_year = 2000 - 1900;
broken_down.tm_mon = 0;
broken_down.tm_mday = 1;
broken_down.tm_hour = broken_down.tm_min = broken_down.tm_sec = 0;
printf("Current date and time: %s", asctime(&broken_down));
}
字符串
这个程序在ideone.com上打印Current date and time: Sun Jan 1 00:00:00 2000
,即日期字段是空格填充的。
当我用MSVC编译并运行这个程序时,它会生成一个日期字符串,该字符串在月份的某一天带有前导零:Current date and time: Sun Jan 01 00:00:00 2000
。
出现这种差异的原因是什么?哪种格式是正确的?
1条答案
按热度按时间o8x7eapl1#
像往常一样,微软的(非)标准C库的作者没有考虑如何正确实现标准的字母。
即使在原始标准C89/C90中,也会出现以下文本
说明
asctime
函数将timeptr
指向的结构中的故障时间转换为以下形式的字符串字符串
使用以下算法的等价物。
型
不幸的是,这个例子本身使用了一个日期,它有一个2位数的月份,但是代码显然使用了
%3d
,这意味着一个没有前导零的十进制数 * 在一个3个字符宽的字段中填充空格并右对齐 *。给定的分解时间的结果是
Sun Jan 1 00:00:00 2000
,带有空格填充。Python 2在2.7.15之前一直公开C标准库
asctime
的输出,不包括换行符,这导致了平台依赖的行为。在2.7.15中,它被修复为使用带前导空格的硬编码格式。Python 2文档也在其示例中使用了带有2位数月份的日期,这进一步增加了混乱。