我知道size_t是无符号的,因此不允许使用负值,因为据我所知,time_t是带符号的,因此可以将-1分配给size_t。但是,对于time_t我不确定。如果遵循头文件中的定义,我将在这里结束:
typedef __time_t time_t;
,然后在这里:
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
最后
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE
我不太确定__SYSCALL_SLONG_TYPE是什么,但我想它是带符号的。不幸的是,即使进行了此跟踪,我也只能希望其他c ++ 11平台具有相同的实现。我仍然不确定这对所有用户而言是否合法且定义明确:
size_t foo = -1;
当然,对time_t进行签名是有意义的,因为可以具有负的时间偏移量,例如对时区建模。但是另一方面,将其取消签名是有意义的,因为在1970年之后需要数秒的时间。因此,常识是双向的:)在time_t上搜索时返回以下内容:
“出于历史原因,通常将其实现为一个整数值,该整数值表示自UTC 1970年1月1日00:00以来经过的秒数(即unix时间戳)。尽管图书馆可以使用其他时间表示形式来实现这种类型。”
资料来源:http://www.cplusplus.com/reference/ctime/time_t/
并在同一页上:“便携式程序不应直接使用此类型的值,而应始终依靠对标准库元素的调用将它们转换为可移植类型。”
所以time_t并不是在所有系统上都定义得很好,但是,time()返回一个time_t:所以我不是第一个在接口中导出它的人。我应该使用其他什么类型?
我问这两个原因:
速度:使用struct,就像struct tm一样慢,因为它具有更多字节,因此将其复制或与另一个struct tm比较将比使用long慢。
排序:我想为日期提供一种快速的数据类型,这使我可以执行
问题:由于在所有平台上time_t并不是一个定义明确的时间表示形式,我可以使用哪种类型的数据类型(1)快速且(2)可比较,并且是可移植的?
例如,关于time_t的顺序:
#include <iostream>
#include <ctime>
#include <cstring>
int main() {
struct tm tm_a, tm_b;
memset(&tm_a, 0, sizeof(struct tm));
memset(&tm_b, 0, sizeof(struct tm));
if(strptime("2014-01-01 12:00:00", "%Y-%m-%d %H:%M:%s", &tm_a) && strptime("2014-01-01 11:59:59", "%Y-%m-%d %H:%M:%s", &tm_b)) {
if(mktime(&tm_a) > mktime(&tm_b)) std::cout << "time_t ordering OK." << std::endl;
else std::cout << "time_t ordering tainted" << std::endl;
} else std::cout << "failed to parse time" << std::endl;
return 0;
}
在所有平台上,time_t都将保持不变吗?
最佳答案
不管(time_t)(-1)
实际是什么,time_t
都已经表示“这不是有效时间”。标准函数mktime
会在错误时返回此值,您也可以。
C和C ++标准没有提及time_t
中的时间编码。标准函数difftime
计算两次表示为double
的时间之间的时间差(以秒为单位),是time_t
,这是按时间顺序排列time_t
值的唯一有效方法。但是,POSIX标准指定了time_t
是秒数的时间,因此在POSIX系统上,可以直接将time_t
与<
进行比较。
请注意,C和POSIX都允许time_t
是任何算术类型(不仅仅是整数)。
关于c++ - 将std::string写入类似的* time *解析器,这可能会失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24219706/