這篇文章介紹 標準時間與秒單位,秒單位與標準時間的轉(zhuǎn)換方式,這份代碼一般用在嵌入式單片機里比較多,比如:設(shè)置RTC時鐘的時間,從RTC里讀取秒單位時間后,需要轉(zhuǎn)換成標準時間顯示。
下面列出的兩個例子里,注釋和思路都寫了,思路和實現(xiàn)辦法在代碼注釋里。
1. 時間轉(zhuǎn)換-秒與標準時間的轉(zhuǎn)換
1.時間轉(zhuǎn)換(秒與標準時間的轉(zhuǎn)換)
(1)函數(shù)1: 將秒單位時間轉(zhuǎn)為標準時間。 --RTC實時時鐘—>秒為單位—>每秒鐘cnt++;
237562867493 -----xxxx年xx月xx日xx時xx分xx秒 星期x。
示例代碼: (模擬電子鐘)
#include
#include //字符串處理
#include
//時間單位
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)
{
//將標準時間轉(zhuǎn)為秒單位時間 (設(shè)置時間)
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;
}
/*
函數(shù)功能: 判斷平年和閏年
函數(shù)返回值: 1表示閏年 0表示平年
*/
int GetYearStat(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)return 1; //閏年
return 0; //平年
}
/*
將秒單位時間轉(zhuǎn)為標準時間
時間基準點: 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;
}
/*
將標準時間轉(zhuǎn)為秒單位時間
思路: 全程加法
時間基準點: 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. 轉(zhuǎn)換年*/
for(i=1970; i
#include //字符串處理
#include
//時間單位
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)
{
//將標準時間轉(zhuǎn)為秒單位時間 (設(shè)置時間)
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;
}
/*
函數(shù)功能: 判斷平年和閏年
函數(shù)返回值: 1表示閏年 0表示平年
*/
int GetYearStat(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)return 1; //閏年
return 0; //平年
}
/*
將秒單位時間轉(zhuǎn)為標準時間
時間基準點: 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. 時間轉(zhuǎn)換-標準時間轉(zhuǎn)秒
(2)函數(shù)2: 將標準時間轉(zhuǎn)為秒單位的時間。
2018年6月1日19點41分23秒----------xxxxxxx秒
閏年366,平年365。 區(qū)分: 每年二月份相差一天.
標準時間基準點: 1970年1月1日0時0分0秒。
/*
將標準時間轉(zhuǎn)為秒單位時間
思路: 全程加法
時間基準點: 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. 轉(zhuǎn)換年*/
for(i=1970; i;>
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
單片機
+關(guān)注
關(guān)注
6076文章
45495瀏覽量
670450 -
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145610 -
RTC
+關(guān)注
關(guān)注
2文章
653瀏覽量
71835
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
飛凌嵌入式ElfBoard-系統(tǒng)信息與資源之時間的概念
(Coordinated Universal Time)是國際上用于協(xié)調(diào)時間的標準。它不是一個時區(qū),而是一個時間標準,定義為格林威治標準時間
發(fā)表于 01-15 08:54
利用單片機的端口分別控制LCD1602標準時鐘系統(tǒng)
網(wǎng)上轉(zhuǎn)載:利用單片機的端口分別控制LCD1602標準時鐘系統(tǒng)、蜂鳴器和LED燈,達到智能操控照明系統(tǒng),并用PROTEL 99SE軟件對原理圖和電路板的制作。這個主要是對光照的控制用單片機
發(fā)表于 11-19 07:15
ESP8266 NODEMCU是怎樣獲取互聯(lián)網(wǎng)上面時間服務器標準時間的呢
ESP8266 NODEMCU是怎樣獲取互聯(lián)網(wǎng)上面時間服務器標準時間的呢?其城訓代碼該怎樣去編寫呢?
發(fā)表于 02-15 06:43
嵌入式代碼如何解決時間問題、編碼問題
UTC時間(Universal Time Coordinated, 世界標準時間或世界協(xié)調(diào)時間),以原子時秒長為基礎(chǔ),在時刻上盡量接近于世界時的一種
發(fā)表于 11-14 15:46
?1257次閱讀
安徽京準:GPS北斗衛(wèi)星時鐘服務器創(chuàng)標準時間秩序
安徽京準:GPS北斗衛(wèi)星時鐘服務器創(chuàng)標準時間秩序
精準同步背后的科學:標準時間網(wǎng)絡(luò)的運維經(jīng)驗解析
在現(xiàn)代社會,標準時間同步時鐘網(wǎng)絡(luò)是金融、電力、通信等行業(yè)的核心基礎(chǔ)設(shè)施之一。它的精準性不僅依賴于先進的技術(shù),更離不開長期的運維經(jīng)驗積累。本文將探討標準時間同步網(wǎng)絡(luò)在實際應用中的關(guān)鍵經(jīng)驗,揭示其穩(wěn)定運行背后的科學邏輯。
時間同步:數(shù)字世界的“隱形秩序”
該設(shè)備從GPS或北斗地球同步衛(wèi)星上獲取標準時鐘信號信息,將這些標準時間信息在網(wǎng)絡(luò)中傳輸,網(wǎng)絡(luò)中需要時間信號的設(shè)備如計算機,DVR、等設(shè)備就可以與標準時鐘信號同步。裝置同時使用GPS和北
NTP校時服務器:數(shù)字世界的精準時間守護者
作為數(shù)字基礎(chǔ)設(shè)施中看似不起眼卻重要的一環(huán),NTP校時服務器以其嚴謹?shù)乃惴ê涂煽康募軜?gòu),默默維系著信息世界的時空秩序。從依托北斗、GPS等衛(wèi)星信號獲取標準時間,到通過分層網(wǎng)絡(luò)將精準時間傳遞至每一個終端,NTP技術(shù)仍在持續(xù)演進,以滿足5G、人工智能等新興技術(shù)對
C語言_標準時間與秒單位的轉(zhuǎn)換
評論