【自学嵌入式:stm32单片机】Unix时间戳

Unix时间戳

Unix时间戳简介

  • Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
  • 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
  • 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间

image

UTC/GMT

  • GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准
  • UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致

【注】闰秒是为了调和两种时间标准的差异而设置的 “额外 1 秒”(或极少情况的 “减去 1 秒”),根源是地球自转的不稳定性与原子时的绝对稳定性冲突

时间戳转换

C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换

函数 作用
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*); 日期时间转换为字符串(自定义格式)

image

用vs测试一下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>

time_t time_cnt;
struct tm time_date;
char* time_str;

int main()
{
	//time_cnt = time(NULL);
	//time(&time_cnt);
	time_cnt = 1672588795; //也可以手动给一个时间
	//time_date = *gmtime(&time_cnt);
	time_date = *localtime(&time_cnt);
	printf("%d\n", time_date.tm_year + 1900); //偏移
	printf("%d\n", time_date.tm_mon + 1); //偏移
	printf("%d\n", time_date.tm_mday);
	printf("%d\n", time_date.tm_hour);
	printf("%d\n", time_date.tm_min);
	printf("%d\n", time_date.tm_sec);
	//mktime根据时间返回时间秒数
	time_cnt = mktime(&time_date);
	printf("%d\n", time_cnt);
	time_str = ctime(&time_cnt);
	printf(time_str);
	char t[50];
	strftime(t, 50, "%H-%M-%S", &time_date);
	printf(t);
	return 0;
}

测试结果:
image

posted @ 2025-08-29 09:41  秦瑞迁  阅读(32)  评论(0)    收藏  举报