我知道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/

10-12 14:39