下面的程序演示如何使用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
。造成这种差异的原因是什么?哪种格式正确?
最佳答案
与往常一样,微软(non-)标准C库的作者们并没有充分考虑如何正确地实现标准字母。
即使在原始标准C89/C90中,也会出现以下文本
说明asctime
函数转换结构中的故障时间
由timeptr
指向窗体中的字符串
Sun Sep 16 01:03:52 1973\n\0
使用下列算法的等价项。
char *asctime(const struct tm *timeptr)
{
static const char wday_name[7][3] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[12][3] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char result[26];
sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
wday_name[timeptr->tm_wday],
mon_name[timeptr->tm_mon],
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
1900 + timeptr->tm_year);
return result;
}
不幸的是,示例本身使用了一个月中有两位数字的日期,但是代码使用了
%3d
,这意味着在一个3个字符宽的字段中填充一个十进制数字空间并右对齐。对于给定的故障时间,使用空格填充的结果是
Sun Jan 1 00:00:00 2000
。Python2,直到2.7.15,一直在按原样公开C标准库
asctime
输出,更少的是导致依赖平台行为的换行符,现在在2.7.15中被修复为使用带有前导空格的硬编码格式。Python 2文档在其示例中也使用了一个日期和两位数的月份,这进一步增加了混淆。