我在linux框中搜索并看到它是typedef
typedef __time_t time_t;
但找不到__time_t定义.
该time_t的维基百科文章文章揭示了一些这方面的光.底线是time_t
C规范中不保证类型.
的
time_t
数据类型是用于存储系统时间值所定义的ISO C库中的数据类型.这些值从标准time()
库函数返回.此类型是标准头中定义的typedef.ISO C将time_t定义为算术类型,但未指定任何特定类型,范围,分辨率或编码.还未指定应用于时间值的算术运算的含义.符合Unix和POSIX标准的系统将该
time_t
类型实现为signed integer
(通常为32或64位宽),表示自Unix时期开始以来的秒数:1970年1月1日的午夜UTC(不计算闰秒).有些系统正确处理负时间值,而有些则没有.使用32位time_t
类型的系统容易受到2038年问题的影响.
[root]# cat time.c
#includeint main(int argc, char** argv) { time_t test; return 0; }
[root]# gcc -E time.c | grep __time_t
typedef long int __time_t;
$INCDIR/bits/types.h
通过以下方式定义:
# 131 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 132 "/usr/include/bits/types.h" 2 3 4
标准
威廉·布伦德尔引用维基百科,但我更喜欢马的嘴巴.
C99 N1256标准草案 7.23.1/3"时间组成部分"说:
声明的类型是size_t(在7.17中描述)clock_t和time_t,它们是能够表示时间的算术类型
和6.2.5/18"类型"说:
整数和浮点类型统称为算术类型.
POSIX 7 sys_types.h说:
[CX] time_t应为整数类型.
其中[CX]
被定义为:
[CX]扩展到ISO C标准.
这是一个延伸,因为它提供了更强有力的保证:浮点数已经出局.
gcc one-liner
无需创建Quassnoi提到的文件:
echo | gcc -E -xc -include 'time.h' - | grep time_t
在Ubuntu 15.10 GCC 5.2上,前两行是:
typedef long int __time_t; typedef __time_t time_t;
命令明细与一些引用来自man gcc
:
-E
:"在预处理阶段后停止;不要正确运行编译器."
-xc
:指定C语言,因为输入来自没有文件扩展名的stdin.
-include file
:"处理文件好像"#include"file""出现在主要源文件的第一行."
-
:从标准输入输入
答案肯定是特定于实现的.要明确找到您的平台/编译器,只需在代码中的某处添加此输出:
printf ("sizeof time_t is: %d\n", sizeof(time_t));
如果答案是4(32位)并且您的数据要超过2038,那么您有25年的时间来迁移代码.
如果您将数据存储为字符串,那么您的数据就可以了,即使它很简单:
FILE *stream = [stream file pointer that you've opened correctly]; fprintf (stream, "%d\n", (int)time_t);
然后以同样的方式读回它(fread,fscanf等等到int中),你就有了你的纪元偏移时间..Net中存在类似的解决方法.我在Win和Linux系统之间传递64位纪元数字没有问题(通过通信渠道).这带来了字节排序问题,但这是另一个主题.
要回答paxdiablo的查询,我会说,它印有"19100",因为该计划是这样写的(我承认我这样做是在80年代我自己):
time_t now; struct tm local_date_time; now = time(NULL); // convert, then copy internal object to our object memcpy (&local_date_time, localtime(&now), sizeof(local_date_time)); printf ("Year is: 19%02d\n", local_date_time.tm_year);
该printf
语句打印固定字符串"Year is:19",后跟一个零填充字符串,其中包含"1900年以来的年份"(定义tm->tm_year
).在2000年,这个值显然是100."%02d"
垫有两个零,但如果长度超过两位则不截断.
正确的方法是(仅改为最后一行):
printf ("Year is: %d\n", local_date_time.tm_year + 1900);
新问题:这种想法的基本原理是什么?
在Visual Studio 2008下,__int64
除非您定义,否则默认为a _USE_32BIT_TIME_T
.你最好假装你不知道它的定义是什么,因为它可以(并且将会)从平台变为平台.
time_t
是long int
64位机器上的类型,否则它是long long int
.
您可以在这些头文件中验证这一点:
time.h
:/usr/include
types.h
和typesizes.h
:/usr/include/x86_64-linux-gnu/bits
(下面的陈述不是一个接一个.可以使用Ctrl + f搜索在resp.头文件中找到它们.)
1)在 time.h
typedef __time_t time_t;
2)在 types.h
# define __STD_TYPE typedef __STD_TYPE __TIME_T_TYPE __time_t;
3)在 typesizes.h
#define __TIME_T_TYPE __SYSCALL_SLONG_TYPE #if defined __x86_64__ && defined __ILP32__ # define __SYSCALL_SLONG_TYPE __SQUAD_TYPE #else # define __SYSCALL_SLONG_TYPE __SLONGWORD_TYPE #endif
4)再次进入 types.h
#define __SLONGWORD_TYPE long int #if __WORDSIZE == 32 # define __SQUAD_TYPE __quad_t #elif __WORDSIZE == 64 # define __SQUAD_TYPE long int #if __WORDSIZE == 64 typedef long int __quad_t; #else __extension__ typedef long long int __quad_t;