聊聊UTC時間那些事

2021-10-01 03:16:29 字數 2531 閱讀 9000

最近做了乙個微控制器的專案,採用外接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 ...