最近做了乙個微控制器的專案,採用外接rtc模組,而外接模組只有年月日時分秒暫存器,需要用到時間戳對發生的事件和日誌做記錄。於是就想做乙個使用在微控制器上的utc轉unix時間戳的庫。
先說一下什麼是utc時間,utc是coordinated universal time縮寫,中文又稱協調世界時。在了解utc時間系統的時候,還有乙個叫gmt的時間系統,gmt中文稱為格林威治標準時間。嚴格意義上來說utc是最接近gmt的,但是對於大多數用途來說,utc時間是可以與gmt時間進行互換的。目前gmt時間已不再被科學界所確定。更多的關於utc時間的介紹請移步哈哈,作者偷個懶
搞清楚什麼是utc時間之後,我們就需要知道另乙個概念unix時間戳,什麼是unix時間戳呢,看一下定義:unix時間戳是從2023年1月1日(utc的午夜),可以理解為2023年1月1日 00:00:00,開始所經過的秒數,不考慮閏秒。有童鞋會問什麼是閏秒,簡單的來說,地球由於自身的自轉在變慢,每一天並不是真的只有86400秒,每天慢一點,每天慢一點,過了很多年就慢出了一秒來了,那這一秒要怎麼處理呢,當然是加進去了,這就是閏秒。更多詳細資訊,請移步上述鏈結。
搞清楚以上的概念之後呢,我們就來搞清楚我們的問題是什麼:
將unix時間戳轉換為對應時區的utc時間;
將對應時區的utc時間轉換為unix時間戳;
先來解決第乙個問題,。。。。。廢話不多說,直接上**
#ifndef timemodule_h
#define timemodule_h
typedef unsigned long unixtime_t;
#pragma pack(1)
typedef struct _timezone_ttimezone_t; //時區結構體
typedef struct _utctime_tutctime_t;
#pragma pack()
unixtime_t getunixtimefromutctime(utctime_t utctime);
unsigned char getutctimefromunixtime(unixtime_t utime, utctime_t * utctime);
#endif
其中函式
unixtime_t getunixtimefromutctime(utctime_t utctime);
表示從utc時間獲取unix時間戳。
unsigned char getutctimefromunixtime(unixtime_t utime,utctime_t * utctime);
從該函式中通過unix時間戳獲取相對應時區的utc時間。
實現**如下:
#include "timemodule.h"
#define fouryearseconds 126230400ul
//2023年1月1日 00:00:00 utc時間對應的unixtime,週六,我們預設從2023年算起
#define unixtimeof2000 946684800ul
static const unsigned char mon1[12] = ;
static const unsigned char mon2[12] = ;
unsigned char getutctimefromunixtime(unixtime_t utime,utctime_t * utctime)
unixtime_t utc;
unsigned char *pmon;
utc = utime;
utc = utime - unixtimeof2000;
if(0 == utctime->timezone.timezonedir)else
utctime->weekday = (utc/86400 + 6)%7;
utctime->year = ((utc / fouryearseconds) * 4 + 2000);
utc = utc % fouryearseconds;
if((utc - 94694400ul) > 0)else if((utc - 63158400ul) > 0)else if((utc - 31622400ul) > 0)else
unsigned char i;
for (i = 0; i < 12; i++)
utc = utc - (*(pmon + i) * 86400);
} utctime->mouth = i + 1;
utctime->day = utc / 86400 + 1;
utc = utc % 86400;
utctime->hour = utc / 3600;
utc = utc % 3600;
utctime->minute = utc / 60;
utctime->second = utc % 60;
return 0;
}unixtime_t getunixtimefromutctime(utctime_t utctime);
聊聊字元編碼那些事
計算機字元編碼的歷史 在windows作業系統下可以通過命令列模式檢視系統使用的字符集,如下圖所示 從圖中看到,活動頁 為936,代表gb2312 簡體中文 作者的個人計算機安裝的是windows10簡體中文版。microsoft visual studio整合開發環境採用的字元編碼是作業系統使用的...
聊聊fork的那些事
參加了一場面試 學會了乙個知識點 fork之後發生了 什麼 我很正常的做出了回答,對父程序的記憶體進行了複製。fork之後 在早期的unix的系統是通過複製的 為系統分配 記憶體頁 初始化記憶體頁 將父程序的記憶體內容分配到子程序當中 這造成了什麼?這造成了cpu和記憶體的浪費,如果乙個父程序1個g...
iOS 聊聊加密的那些事
情景 網頁載入快取可能會用到nsurlcache,每次請求會返回乙個urlcacheresponse.現在我們需要將每個url儲存在caches檔案中,為了加密,要對每個url使用md5加密技術。相應的 段是 const char cstr str utf8string unsigned char ...