C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換
前言:
這篇文章介紹 標(biāo)準(zhǔn)時(shí)間與秒單位,秒單位與標(biāo)準(zhǔn)時(shí)間的轉(zhuǎn)換方式,這份代碼一般用在嵌入式單片機(jī)里比較多,比如:設(shè)置RTC時(shí)鐘的時(shí)間,從RTC里讀取秒單位時(shí)間后,需要轉(zhuǎn)換成標(biāo)準(zhǔn)時(shí)間顯示。
下面列出的兩個(gè)例子里,注釋和思路都寫了,思路和實(shí)現(xiàn)辦法在代碼注釋里,
1. 時(shí)間轉(zhuǎn)換-秒與標(biāo)準(zhǔn)時(shí)間的轉(zhuǎn)換
1.時(shí)間轉(zhuǎn)換(秒與標(biāo)準(zhǔn)時(shí)間的轉(zhuǎn)換)
(1)函數(shù)1: 將秒單位時(shí)間轉(zhuǎn)為標(biāo)準(zhǔn)時(shí)間。 --RTC實(shí)時(shí)時(shí)鐘—>秒為單位—>每秒鐘cnt++;
237562867493 -----xxxx年xx月xx日xx時(shí)xx分xx秒 星期x。
示例代碼: (模擬電子鐘)
#include <stdio.h>
#include <string.h> //字符串處理
#include <Windows.h>
//時(shí)間單位
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)
{
//將標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)為秒單位時(shí)間 (設(shè)置時(shí)間)
unsigned int time=TimeToSec(2018,6,6,16,40,20);
while(1)
{
time++;
Sleep(1000); //睡眠1秒時(shí)間。 單位是ms
SecToTime(time);
printf("%d-%d-%d %d:%d:%d\n",year,mon,mdeay,hour,min,t_sec);
}
return 0;
}
/*
函數(shù)功能: 判斷平年和閏年
函數(shù)返回值: 1表示閏年 0表示平年
*/
int GetYearStat(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)return 1; //閏年
return 0; //平年
}
/*
將秒單位時(shí)間轉(zhuǎn)為標(biāo)準(zhǔn)時(shí)間
時(shí)間基準(zhǔn)點(diǎn): 1970年1月1日0時(shí)0分0秒
思想: 減法
*/
void SecToTime(unsigned int sec)
{
int i;
year=1970; //基準(zhǔn)年份
/*1. 計(jì)算過了多少年*/
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. 計(jì)算過了多少月*/
mon=1;
if(GetYearStat(year)) //閏年
{
for(i=0; i<12; i++)
{
if(sec>=mon_r[i]*24*60*60) //夠一個(gè)月
{
sec-=mon_r[i]*24*60*60; //減去一個(gè)月
mon++;//增加一個(gè)月
}
else break;
}
}
else
{
for(i=0; i<12; i++)
{
if(sec>=mon_p[i]*24*60*60) //夠一個(gè)月
{
sec-=mon_p[i]*24*60*60; //減去一個(gè)月
mon++;//增加一個(gè)月
}
else break;
}
}
/*3. 計(jì)算過了多少天*/
mdeay=1;
while(sec>=24*60*60) //判斷是否夠一天
{
sec-=24*60*60;
mdeay++;
}
/*4. 過了多少小時(shí)*/
hour=0;
while(sec>=60*60)
{
sec-=60*60;
hour++;
}
/*5. 過了多少分鐘*/
min=0;
while(sec>=60)
{
sec-=60;
min++;
}
/*6. 過了多少秒*/
t_sec=sec;
}
/*
將標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)為秒單位時(shí)間
思路: 全程加法
時(shí)間基準(zhǔn)點(diǎn): 1970年1月1日0時(shí)0分0秒
返回值: 得到的秒單位時(shí)間
*/
unsigned int TimeToSec(int year,int mon,int mdeay,int hour,int min,int sec)
{
int i;
int sec_cnt=0; //記錄秒單位的時(shí)間
/*1. 轉(zhuǎn)換年*/
for(i=1970; i<year; i++)
{
if(GetYearStat(i)) //閏年
{
sec_cnt+=366*24*60*60;
}
else
{
sec_cnt+=365*24*60*60;
}
}
/*2. 轉(zhuǎn)換月*/
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. 轉(zhuǎn)換天數(shù)*/
sec_cnt+=(mdeay-1)*24*60*60;
/*4. 轉(zhuǎn)換小時(shí)*/
sec_cnt+=hour*60*60;
/*5. 轉(zhuǎn)換分鐘*/
sec_cnt+=min*60;
/*6. 轉(zhuǎn)換秒*/
sec_cnt+=sec;
return sec_cnt; //返回秒單位時(shí)間
}完整的代碼(添加星期):
#include <stdio.h>
#include <string.h> ?//字符串處理
#include <Windows.h>?
//時(shí)間單位
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)
{
?? ?//將標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)為秒單位時(shí)間 ?(設(shè)置時(shí)間)
?? ?unsigned int time=TimeToSec(2018,9,1,16,40,20);
?? ?while(1)
?? ?{
?? ??? ?time++;
?? ??? ?Sleep(1000); //睡眠1秒時(shí)間。 單位是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;
}
/*
函數(shù)功能: 判斷平年和閏年
函數(shù)返回值: 1表示閏年 ?0表示平年
*/
int GetYearStat(int year)
{
?? ?if((year%4==0&&year%100!=0)||year%400==0)return 1; //閏年
?? ?return 0; //平年
}
/*
將秒單位時(shí)間轉(zhuǎn)為標(biāo)準(zhǔn)時(shí)間
時(shí)間基準(zhǔn)點(diǎn): 1970年1月1日0時(shí)0分0秒
思想: 減法
*/
void SecToTime(unsigned int sec)
{
?? ?int i;
?? ?year=1970; //基準(zhǔn)年份
?? ?/*1. 計(jì)算過了多少年*/
?? ?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. 計(jì)算過了多少月*/
?? ?mon=1;
?? ?if(GetYearStat(year)) //閏年
?? ?{
?? ??? ?for(i=0; i<12; i++)
?? ??? ?{
?? ??? ??? ?if(sec>=mon_r[i]*24*60*60) //夠一個(gè)月
?? ??? ??? ?{
?? ??? ??? ??? ?sec-=mon_r[i]*24*60*60; //減去一個(gè)月
?? ??? ??? ??? ?mon++;//增加一個(gè)月
?? ??? ??? ?}
?? ??? ??? ?else break;
?? ??? ?}
?? ?}
?? ?else
?? ?{
?? ??? ?for(i=0; i<12; i++)
?? ??? ?{
?? ??? ??? ?if(sec>=mon_p[i]*24*60*60) //夠一個(gè)月
?? ??? ??? ?{
?? ??? ??? ??? ?sec-=mon_p[i]*24*60*60; //減去一個(gè)月
?? ??? ??? ??? ?mon++;//增加一個(gè)月
?? ??? ??? ?}
?? ??? ??? ?else break;
?? ??? ?}
?? ?}
?? ?
?? ?/*3. 計(jì)算過了多少天*/
?? ?mdeay=1;
?? ?while(sec>=24*60*60) //判斷是否夠一天
?? ?{
?? ??? ?sec-=24*60*60;
?? ??? ?mdeay++;
?? ?}
?? ?/*4. 過了多少小時(shí)*/
?? ?hour=0;
?? ?while(sec>=60*60)
?? ?{
?? ??? ?sec-=60*60;
?? ??? ?hour++;
?? ?}
?? ?/*5. 過了多少分鐘*/
?? ?min=0;
?? ?while(sec>=60)
?? ?{
?? ??? ?sec-=60;
?? ??? ?min++;
?? ?}
?? ?/*6. 過了多少秒*/
?? ?t_sec=sec;?
}2. 時(shí)間轉(zhuǎn)換-標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)秒
(2)函數(shù)2: 將標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)為秒單位的時(shí)間。
2018年6月1日19點(diǎn)41分23秒----------xxxxxxx秒
閏年366,平年365。 區(qū)分: 每年二月份相差一天.
標(biāo)準(zhǔn)時(shí)間基準(zhǔn)點(diǎn): 1970年1月1日0時(shí)0分0秒。
/*
將標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)為秒單位時(shí)間
思路: 全程加法
時(shí)間基準(zhǔn)點(diǎn): 1970年1月1日0時(shí)0分0秒
返回值: 得到的秒單位時(shí)間
*/
unsigned int TimeToSec(int year,int mon,int mdeay,int hour,int min,int sec)
{
int i;
int sec_cnt=0; //記錄秒單位的時(shí)間
/*1. 轉(zhuǎn)換年*/
for(i=1970; i<year; i++)
{
if(GetYearStat(i)) //閏年
{
sec_cnt+=366*24*60*60;
}
else
{
sec_cnt+=365*24*60*60;
}
}
/*2. 轉(zhuǎn)換月*/
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. 轉(zhuǎn)換天數(shù)*/
sec_cnt+=(mdeay-1)*24*60*60;
/*4. 轉(zhuǎn)換小時(shí)*/
sec_cnt+=hour*60*60;
/*5. 轉(zhuǎn)換分鐘*/
sec_cnt+=min*60;
/*6. 轉(zhuǎn)換秒*/
sec_cnt+=sec;
return sec_cnt;
}
/*
函數(shù)功能: 根據(jù)秒單位時(shí)間獲取星期
函數(shù)形參: 秒單位時(shí)間
返回值 :星期(1~7)
*/
int GetWeek(unsigned int sec)
{
int mdeay=sec/60/60/24; //將秒單位時(shí)間轉(zhuǎn)為天數(shù)
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;
}
}到此這篇關(guān)于C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C語言時(shí)間轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)簡(jiǎn)單BP神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單BP神經(jīng)網(wǎng)絡(luò),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
C++控制臺(tái)實(shí)現(xiàn)簡(jiǎn)單注冊(cè)登錄
這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)簡(jiǎn)單注冊(cè)登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12

