C语言_标准时间与秒单位的转换

举报
DS小龙哥 发表于 2022/03/24 23:32:53 2022/03/24
【摘要】 这篇文章介绍 标准时间与秒单位,秒单位与标准时间的转换方式,这份代码一般用在嵌入式单片机里比较多,比如:设置RTC时钟的时间,从RTC里读取秒单位时间后,需要转换成标准时间显示。

这篇文章介绍 标准时间与秒单位,秒单位与标准时间的转换方式,这份代码一般用在嵌入式单片机里比较多,比如:设置RTC时钟的时间,从RTC里读取秒单位时间后,需要转换成标准时间显示。

下面列出的两个例子里,注释和思路都写了,思路和实现办法在代码注释里。

1. 时间转换-秒与标准时间的转换

1.时间转换(秒与标准时间的转换)
(1)函数1: 将秒单位时间转为标准时间。 --RTC实时时钟—>秒为单位—>每秒钟cnt++;
237562867493 -----xxxx年xx月xx日xx时xx分xx秒 星期x。

示例代码: (模拟电子钟)

#include <stdio.h>
#include <string.h>  //字符串处理
#include <Windows.h> 

//时间单位
int year,mon,mdeay,hour,min,t_sec;

//闰年的月份
int mon_r[12]={31,29,31,30,31,30,31,31,30,31,30,31};

//平年的月份
int mon_p[12]={31,28,31,30,31,30,31,31,30,31,30,31};

unsigned int TimeToSec(int year,int mon,int mdeay,int hour,int min,int sec);
void SecToTime(unsigned int sec);


int main(void)
{
	//将标准时间转为秒单位时间  (设置时间)
	unsigned int time=TimeToSec(2018,6,6,16,40,20);
	
	while(1)
	{
		time++;
		Sleep(1000); //睡眠1秒时间。 单位是ms
		SecToTime(time);
		printf("%d-%d-%d %d:%d:%d\n",year,mon,mdeay,hour,min,t_sec);
	}
	return 0;
}

/*
函数功能: 判断平年和闰年
函数返回值: 1表示闰年  0表示平年
*/
int GetYearStat(int year)
{
	if((year%4==0&&year%100!=0)||year%400==0)return 1; //闰年
	return 0; //平年
}

/*
将秒单位时间转为标准时间
时间基准点: 1970年1月1日0时0分0秒
思想: 减法
*/
void SecToTime(unsigned int sec)
{
	int i;
	year=1970; //基准年份
	/*1. 计算过了多少年*/
	while(sec>=365*24*60*60) //秒还够一年
	{
		if(GetYearStat(year)) //闰年
		{
			if(sec>366*24*60*60)
			{
				sec-=366*24*60*60; //减去一年
				year++; //年份累加
			}
			else
			{
				break;
			}
		}
		else
		{
			sec-=365*24*60*60; //减去一年
			year++; //年份累加
		}
	}

	/*2. 计算过了多少月*/
	mon=1;
	if(GetYearStat(year)) //闰年
	{
		for(i=0; i<12; i++)
		{
			if(sec>=mon_r[i]*24*60*60) //够一个月
			{
				sec-=mon_r[i]*24*60*60; //减去一个月
				mon++;//增加一个月
			}
			else break;
		}
	}
	else
	{
		for(i=0; i<12; i++)
		{
			if(sec>=mon_p[i]*24*60*60) //够一个月
			{
				sec-=mon_p[i]*24*60*60; //减去一个月
				mon++;//增加一个月
			}
			else break;
		}
	}
	
	/*3. 计算过了多少天*/
	mdeay=1;
	while(sec>=24*60*60) //判断是否够一天
	{
		sec-=24*60*60;
		mdeay++;
	}

	/*4. 过了多少小时*/
	hour=0;
	while(sec>=60*60)
	{
		sec-=60*60;
		hour++;
	}
	/*5. 过了多少分钟*/
	min=0;
	while(sec>=60)
	{
		sec-=60;
		min++;
	}
	/*6. 过了多少秒*/
	t_sec=sec; 
}

/*
将标准时间转为秒单位时间
思路: 全程加法
时间基准点: 1970年1月1日0时0分0秒
返回值: 得到的秒单位时间
*/
unsigned int TimeToSec(int year,int mon,int mdeay,int hour,int min,int sec)
{
	int i;
	int sec_cnt=0; //记录秒单位的时间
	/*1. 转换年*/
	for(i=1970; i<year; i++)
	{
		if(GetYearStat(i)) //闰年
		{
			sec_cnt+=366*24*60*60;
		}
		else
		{
			sec_cnt+=365*24*60*60;
		}
	}

	/*2. 转换月*/
	for(i=0; i<mon-1; i++)
	{
		if(GetYearStat(year)) //闰年
		{
			sec_cnt+=mon_r[i]*24*60*60;
		}
		else
		{
			sec_cnt+=mon_p[i]*24*60*60;
		}
	}

	/*3. 转换天数*/
	sec_cnt+=(mdeay-1)*24*60*60;
	
	/*4. 转换小时*/
	sec_cnt+=hour*60*60;

	/*5. 转换分钟*/
	sec_cnt+=min*60;

	/*6. 转换秒*/
	sec_cnt+=sec;
	return sec_cnt; //返回秒单位时间
}


完整的代码(添加星期):
#include <stdio.h>
#include <string.h>  //字符串处理
#include <Windows.h> 

//时间单位
int year,mon,mdeay,hour,min,t_sec,week;

//闰年的月份
int mon_r[12]={31,29,31,30,31,30,31,31,30,31,30,31};

//平年的月份
int mon_p[12]={31,28,31,30,31,30,31,31,30,31,30,31};

unsigned int TimeToSec(int year,int mon,int mdeay,int hour,int min,int sec);
void SecToTime(unsigned int sec);
int GetWeek(unsigned int sec);

int main(void)
{
	//将标准时间转为秒单位时间  (设置时间)
	unsigned int time=TimeToSec(2018,9,1,16,40,20);
	while(1)
	{
		time++;
		Sleep(1000); //睡眠1秒时间。 单位是ms
		SecToTime(time);
		week=GetWeek(time); //获取星期
		printf("%d-%d-%d %d:%d:%d 星期%d\n",year,mon,mdeay,hour,min,t_sec,week);
	}
	return 0;
}


/*
函数功能: 判断平年和闰年
函数返回值: 1表示闰年  0表示平年
*/
int GetYearStat(int year)
{
	if((year%4==0&&year%100!=0)||year%400==0)return 1; //闰年
	return 0; //平年
}

/*
将秒单位时间转为标准时间
时间基准点: 1970年1月1日0时0分0秒
思想: 减法
*/
void SecToTime(unsigned int sec)
{
	int i;
	year=1970; //基准年份
	/*1. 计算过了多少年*/
	while(sec>=365*24*60*60) //秒还够一年
	{
		if(GetYearStat(year)) //闰年
		{
			if(sec>366*24*60*60)
			{
				sec-=366*24*60*60; //减去一年
				year++; //年份累加
			}
			else
			{
				break;
			}
		}
		else
		{
			sec-=365*24*60*60; //减去一年
			year++; //年份累加
		}
	}

	/*2. 计算过了多少月*/
	mon=1;
	if(GetYearStat(year)) //闰年
	{
		for(i=0; i<12; i++)
		{
			if(sec>=mon_r[i]*24*60*60) //够一个月
			{
				sec-=mon_r[i]*24*60*60; //减去一个月
				mon++;//增加一个月
			}
			else break;
		}
	}
	else
	{
		for(i=0; i<12; i++)
		{
			if(sec>=mon_p[i]*24*60*60) //够一个月
			{
				sec-=mon_p[i]*24*60*60; //减去一个月
				mon++;//增加一个月
			}
			else break;
		}
	}
	
	/*3. 计算过了多少天*/
	mdeay=1;
	while(sec>=24*60*60) //判断是否够一天
	{
		sec-=24*60*60;
		mdeay++;
	}

	/*4. 过了多少小时*/
	hour=0;
	while(sec>=60*60)
	{
		sec-=60*60;
		hour++;
	}
	/*5. 过了多少分钟*/
	min=0;
	while(sec>=60)
	{
		sec-=60;
		min++;
	}
	/*6. 过了多少秒*/
	t_sec=sec; 
}

2. 时间转换-标准时间转秒

(2)函数2: 将标准时间转为秒单位的时间。
2018年6月1日19点41分23秒----------xxxxxxx秒
闰年366,平年365。 区分: 每年二月份相差一天.
标准时间基准点: 1970年1月1日0时0分0秒。

/*
将标准时间转为秒单位时间
思路: 全程加法
时间基准点: 1970年1月1日0时0分0秒
返回值: 得到的秒单位时间
*/
unsigned int TimeToSec(int year,int mon,int mdeay,int hour,int min,int sec)
{
	int i;
	int sec_cnt=0; //记录秒单位的时间
	/*1. 转换年*/
	for(i=1970; i<year; i++)
	{
		if(GetYearStat(i)) //闰年
		{
			sec_cnt+=366*24*60*60;
		}
		else
		{
			sec_cnt+=365*24*60*60;
		}
	}

	/*2. 转换月*/
	for(i=0; i<mon-1; i++)
	{
		if(GetYearStat(year)) //闰年
		{
			sec_cnt+=mon_r[i]*24*60*60;
		}
		else
		{
			sec_cnt+=mon_p[i]*24*60*60;
		}
	}

	/*3. 转换天数*/
	sec_cnt+=(mdeay-1)*24*60*60;
	
	/*4. 转换小时*/
	sec_cnt+=hour*60*60;

	/*5. 转换分钟*/
	sec_cnt+=min*60;

	/*6. 转换秒*/
	sec_cnt+=sec;
	return sec_cnt;
}

/*
函数功能: 根据秒单位时间获取星期
函数形参: 秒单位时间
返回值  :星期(1~7)
*/
int GetWeek(unsigned int sec)
{
	int mdeay=sec/60/60/24; //将秒单位时间转为天数
	switch(mdeay%7)
	{
	case 0: //星期4
		return 4;
		break;
	case 1://星期5
		return 5;
		break;
	case 2: //星期6
		return 6;
		break;
	case 3://星期天
		return 7;
		break;
	case 4://星期1
		return 1;
		break;
	case 5://星期2
		return 2;
		break;
	case 6: //星期3
		return 3;
		break;
	default:
		break;
	}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。