摘要:在Python中获取系统时间,文件输出,省的文件名冲突,或者输出系统时间便于查看。现在主要用C语言了,所以也去看看C语言怎么获取系统时间,主要是获取格林尼治时间,而后转化为东八区时间,代码经过了月底转换月份,闰年变为2月29等测试。
1.代码
1.1 头文件
VS里面要加第一句
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
1.2 获取系统时间函数
void NowTimeString(char* TimeString)
{
int day_list[2][12] = {
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}
};
char day_list_index = 0;//默认不是闰年
time_t timep;
time(&timep);
struct tm* p;
p = gmtime(&timep);
int year = 1900 + p->tm_year;
int month = 1 + p->tm_mon;
int day = (8 + p->tm_hour) / 24 + p->tm_mday;
int hour =(8 + p->tm_hour) % 24;
if ((8 + p->tm_hour) / 24 > 0)//大于0,说明小时大于24小时,
//此时主要是对于天,月,年的处理,小时本身可以处理好
{
if ((month == 2 && p->tm_mday ==28) && (year % 400 == 0 || (year % 4 == 0 && year % 100 == 0)))
//伦敦当前是2月28,并且是闰年的情况下,原先是2月28,加了才回超出
day_list_index = 1;
if (day > day_list[day_list_index][p->tm_mon])
{
if (month == 12 && p->tm_mday == 31)//伦敦时间12月31日,+8会变更年
{
year += 1;
month = 1;
day = 1;
}
else
{
month += 1;
day = 1;
}
}
}
sprintf(TimeString,"%04d_%02d_%02d %02d_%02d_%02d", year, month
, day, hour, p->tm_min, p->tm_sec);
//printf("%d\n", p->tm_sec); /*获取当前秒*/
//printf("%d\n", p->tm_min); /*获取当前分*/
//printf("%d\n", 8 + p->tm_hour); /*获取当前时,这里获取西方的时间,刚好相差八个小时*/
//printf("%d\n", p->tm_mday); /*获取当前月份日数,范围是1-31*/
//printf("%d\n", 1 + p->tm_mon); /*获取当前月份,范围是0-11,所以要加1*/
//printf("%d\n", 1900 + p->tm_year); /*获取当前年份,从1900开始,所以要加1900*/
//printf("%d\n", p->tm_yday); /*从今年1月1日算起至今的天数,范围为0-365*/
//return TimeString;
}
1.3 main函数
int main()
{
char TimeString[30];
NowTimeString(TimeString);
printf(TimeString);
return 0;
}
1.4 结果
2. 问题
- 将上述函数移植到嵌入式里面,keil MDK,stm32f103,C语言识别不了time.h里面定义的struct tm结构体,暂时没有时间去探究了,有知道的小伙伴告诉我一声感谢
参考文献
博客
该参考文献没有考虑格林尼治时间+8以后可能对小时,天和年的影响,以及闰年的影响。