C语言标准时间与秒单位相互转换

 更新时间:2022年5月12日 14:42  点击:1696 作者:DS小龙哥

前言:

这篇文章介绍 标准时间与秒单位,秒单位与标准时间的转换方式,这份代码一般用在嵌入式单片机里比较多,比如:设置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;
	}
}

到此这篇关于C语言标准时间与秒单位相互转换的文章就介绍到这了,更多相关C语言时间转换内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.51cto.com/u_11822586/5288630

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • 教你怎么用Java获取国家法定节假日

    这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • .NET/C# 使用Stopwatch测量运行时间

    这篇文章主要介绍了.NET/C# 使用Stopwatch测量运行时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • mysql中获取一天、一周、一月时间数据的各种sql语句写法

    创建表:复制代码 代码如下:create table if not exists t( id int, addTime datetime default '0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, '2012-07-12 21:00:00′);insert t values(2, '2012-07...2014-05-31
  • 美图秀秀把普通照片快速转换成卡通效果教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下把普通照片快速转换成卡通效果的教程,各位想知道具体制作步骤的使用者们,那么下面就快阿里跟着小编一起看一...2016-09-14
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • C语言中计算正弦的相关函数总结

    这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
  • 详解C语言中的rename()函数和remove()函数的使用方法

    这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • 非常全面的php日期时间运算汇总

    实例讲解之前,先来介绍几个核心函数: mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳。 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。...2015-11-08
  • 浅析C#数据类型转换的几种形式

    本篇文章是对C#中数据类型转换的几种形式进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • C#中动态显示当前系统时间的实例方法

    想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
  • postgresql 中的时间处理小技巧(推荐)

    这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29