网站首页 > 技术文章 正文
这篇文章介绍 标准时间与秒单位,秒单位与标准时间的转换方式,这份代码一般用在嵌入式单片机里比较多,比如:设置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;
}
}
猜你喜欢
- 2024-10-25 宝马X1冷车启动转速忽高忽低什么原因?
- 2024-10-25 你访问的内容存在?3秒后将自动转的惊人原因
- 2024-10-25 高中地理——每日讲1题(地球自转、晨昏线、极昼、日出时刻)
- 2024-10-25 三菱Q系列PLC,年、月、日转换成连续的字符串
- 2024-10-25 频率电压转换器是什么?频率电压转换器工作原理+结构图,秒搞定
- 2024-10-25 电动机定时正转、停止、反转、停止控制
- 2024-10-25 最近咽痛咽干又来袭?医生推荐几个缓解方法,在家就能做→
- 2024-10-25 地球自转为50年来最快:2021将飞逝而过
- 2024-10-25 Excel实践之时间戳格式与日期格式的互转
- 2024-10-25 热带低压生成,将于12小时内加强为台风!对海南影响→
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 506℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 485℃MySQL service启动脚本浅析(r12笔记第59天)
- 465℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 463℃启用MySQL查询缓存(mysql8.0查询缓存)
- 443℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 422℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 418℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)