Unix时间戳
Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
UTC/GMT
GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准
UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致
时间戳转换
C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换
秒计数器数据类型
time_t是__time64_t,而__time64_t是__int64_t,所以time_t实际上就__int64_t,是一个64位有符号的整形数据
日期时间数据类型
tm_sec表示秒,取值范围0~59
tm_min表示分钟,取值范围0~59
tm_hour表示午夜开始的小时,取值范围0~23
tim_maday表示一个月的几号,取值范围1~31
tim_mon表示从1月开始的第几个月,取值范围0~11(1月表示0,2月表示1....12月表示11,所以这个值+1表示月份)
tm_year表示从1900年的第几年(所以这个参数值+1900才是我们所说的年份,这个参数的最小值是70,因为时间戳定义是从1970年开始)
tm_wday表示从周末开始的星期几,取值范围0~6(0表示周末,1表示周一,2表示周二...6表示周六)
tm_yday表示从1月1号开始的第几天,取值范围0~365
tm_isdst表示是否使用夏令时, +1表示使用夏令时,0表示不使用夏令时,-1表示不知道(欧美地区大部分国家,还有其他地区的少部分国家,都还在使用,我国早期也使用过一段时间,但现在已经不用夏令时了)这个东西是为了鼓励大家在夏天早睡早起,节约用电而设计的。
字符串数据类型
char*用来指向表示时间的字符串
函数 | 作用 |
time_t time(time_t*); | 获取系统时钟 |
struct tm* gmtime(const time_t*); | 秒计数器转换为日期时间(格林尼治时间) |
struct tm* localtime(const time_t*); | 秒计数器转换为日期时间(当地时间) |
time_t mktime(struct tm*); | 日期时间转换为秒计数器(当地时间) |
char* ctime(const time_t*); | 秒计数器转换为字符串(默认格式) |
char* asctime(const struct tm*); | 日期时间转换为字符串(默认格式) |
size_t strftime(char*, size_t, const char*, const struct tm*); | 日期时间转换为字符串(自定义格式) |
获取系统时钟
time_t time(time_t*);
秒计数器转换为日期时间
格林尼治时间(伦敦时间)
struct tm* gmtime(const time_t*);
当地时间
struct tm* localtime(const time_t*);
日期时间转换为秒计数器
time_t mktime(struct tm*);
打印的是当地的时间戳
秒计数器转换为字符串
char* ctime(const time_t*);
默认时间格式(不是北京时间)西方国家习惯的时间格式,中国不用这种格式,所以这个函数用的不多。
日期时间转换为字符串
char* asctime(const struct tm*);
与上一个秒计数器显示的效果一样也是默认格式
日期时间转换为字符串
自定义格式
size_t strftime(char*, size_t, const char*, const struct tm*);
可以指定格式,例如%H-%M-%S 小时-分钟-秒,%是占位符,打印时会替换为后面时间的具体值,打印的字符串,通过前两个参数指定到一个数组里