關於CTime ,即time t 詳解

2021-06-22 19:53:32 字數 4621 閱讀 8607

unix時間戳(unix timestamp),或稱unix時間(unix time)、posix時間(posix time),一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。unix時間戳不僅被使用在unix 系統、類unix系統中,也在許多其他作業系統中被廣告採用。

目前相當一部分作業系統使用32位二進位制數字表示時間。此類系統的unix時間戳最多可以使用到格林威治時間2023年01月19日03時14分07秒(二進位制:01111111 11111111 11111111 11111111)。其後一秒,二進位制數字會變為10000000 00000000 00000000 00000000,發生溢位錯誤,造成系統將時間誤解為2023年12月13日20時45分52秒。這很可能會引起軟體故障,甚至系統癱瘓。使用64位二進位制數字表示時間的系統(最多可以使用到格林威治時間292,277,026,596年12月04日15時30分08秒)則基本不會遇到這類溢位問題。

首先我們了解一下時間的相關概念,以及之間的區別,需要了解的時間概念有:[喝小酒的網摘]

本地時間(locale time)

格林威治時間(greenwich mean timegmt

時間協調時間 (universal time coordinatedutc

本地時間,顯而易見不用解釋了

先看看時間的標準:

(1)世界時

世 界時是最早的時間標準。在2023年,國際上將1s確定為全年內每日平均長度的1/8.64×104。以此標準形成的時間系統,稱為世界是,即ut1。 2023年國際上開始使用國際原子時標,從那以後,經過格林威治老天文台本初子午線的時間便被稱為世界時,即ut2,或稱格林威治時間(gmt),是對地 球轉速週期性差異進行校正後的世界時。

(2)原子時

2023年,人們利用銫原子振盪週期極為規律的特性,研製出了高精度的原子時鐘, 將銫原子能級躍遷輻射9192631770周所經歷的時間定為1s。現在用的時間就是2023年10月定義的國際原子時,是通過世界上大約200多台原子 鐘進行對比後,再由國際度量衡局時間所進行資料處理,得出的統一的原子時,簡稱tai。

(3)世界協調時

世界協調時是以地球自轉為基礎的時間標準。由於地球自轉速度並不均勻,並非每天都是精確的86400原子s,因而導致了自轉時間與世界時之間存在18個月有1s的誤差。為糾正這種誤差,國際地球自轉研究所根據地球自轉的實際情況對格林威治時間進行增減閏s的調整,與國際度量衡局時間所聯合向全世界發布標準時間,這就是所謂的世界協調時(utc:coordinatdeuniversaltime)。utc的表示方式為:年(y)、月(m)、日(d)、時(h)、分(min)、秒(s),均用數字表示。

gps 系統中有兩種時間區分,一為utc,另一為lt(地方時)兩者的區別為時區不同,utc就是0時區的時間,地方時為本地時間,如北京為早上八點(東八區),utc時間就為零點,時間比北京時晚八小時,以此計算即可

通過上面的了解,我們可以認為格林威治時間就是時間協調時間(gmt=utc),格林威治時間和utc時間均用秒數來計算的。

而在我們平時工作當中看到的計算機日誌裡面寫的時間大多數是用utc時間來計算的,那麼我們該怎麼將utc時間轉化為本地時間便於檢視日誌,那麼在作程式開發時又該怎麼將本地時間轉化為utc時間呢?

下面就介紹乙個簡單而使用的工具,就是使用linux/unix命令date來進行本地時間和local時間的轉化。

大家都知道,在計算機中看到的utc時間都是從(2023年01月01日 0:00:00)開始計算秒數的。所看到的utc時間那就是從2023年這個時間點起到具體時間共有多少秒。

我們在程式設計中可能會經常用到時間,比如取得系統的時間(獲取系統的年、月、日、時、分、秒,星期等),或者是隔一段時間去做某事,那麼我們就用到一些時間函式。

linux下儲存時間常見的有兩種儲存方式,乙個是從2023年到現在經過了多少秒,乙個是用乙個結構來分別儲存年月日時分秒的。

time_t 這種型別就是用來儲存從2023年到現在經過了多少秒,要想更精確一點,可以用結構struct timeval,它精確到微妙。

struct timeval;

而直接儲存年月日的是乙個結構:

struct tm

;需要特別注意的是,年份是從2023年起至今多少年,而不是直接儲存如2023年,月份從0開始的,0表示一月,星期也是從0開始的, 0表示星期日,1表示星期一。

下面介紹一下我們常用的時間函式:

#include

char *asctime(const struct tm* timeptr);

將結構中的資訊轉換為真實世界的時間,以字串的形式顯示

char *ctime(const time_t *timep);

將timep轉換為真是世界的時間,以字串顯示,它和asctime不同就在於傳入的引數形式不一樣

double difftime(time_t time1, time_t time2);

返回兩個時間相差的秒數

int gettimeofday(struct timeval *tv, struct timezone *tz);

返回當前距離2023年的秒數和微妙數,後面的tz是時區,一般不用

struct tm* gmtime(const time_t *timep);

將time_t表示的時間轉換為沒有經過時區轉換的utc時間,是乙個struct tm結構指標

stuct tm* localtime(const time_t *timep);

和gmtime類似,但是它是經過時區轉換的時間。

time_t mktime(struct tm* timeptr);

將struct tm 結構的時間轉換為從2023年至今的秒數

time_t time(time_t *t);

取得從2023年1月1日至今的秒數。

time, gmtime, asctime 所表示的時間都是utc時間,只是資料型別不一樣,

localtime, ctime 所表示

的時間都是經過時區轉換後

的時間,它和你用系統命令date所表示的cst時間應該保持一致

%r 顯示小時和分鐘:hh:mm

%s 十進位制的秒數

%t 水平製表符

%t 顯示時分秒:hh:mm:ss

%u 每週的第幾天,星期一為第一天 (值從0到6,星期一為0)

%u 第年的第幾周,把星期日做為第一天(值從0到53)

%v 每年的第幾周,使用基於周的年

%w 十進位制表示的星期幾(值從0到6,星期天為0)

%w 每年的第幾周,把星期一做為第一天(值從0到53)

%x 標準的日期串

%x 標準的時間串

%y 不帶世紀的十進位制年份(值從0到99)

%y 帶世紀部分的十制年份

%z,%z 時區名稱,如果不能得到時區名稱則返回空字元。

%% 百分號

如果想顯示現在是幾點了,並以12小時制顯示,就象下面這段程式:

#include "time.h"

#include "stdio.h"

int main(void)

其執行結果為:

it is now 4pm

而下面的程式則顯示當前的完整日期:

#include

#include

#include

int main( void )

{struct tm *newtime;

char tmpbuf[128];

time_t lt1;

time( <1 );

newtime=localtime(<1);

strftime( tmpbuf, 128, "today is %a, day %d of %b in the year %y. ", newtime);

printf(tmpbuf);

return 0;

c 時間型別詳解 time t

unix時間戳 unix timestamp 或稱unix時間 unix time posix時間 posix time 是一種時間表示方式,定義為從格林威治 時間1970年01月01日00時00分00秒起至現在的總秒數。unix時間戳不僅被使用在unix 系統 類unix系統中,也在許多其他作業系...

c 時間型別詳解 time t

分類 c 語言 2011 07 27 14 08 48790人閱讀收藏 舉報c struct unix gccdate unix時間戳 unix timestamp 或稱unix時間 unix time posix時間 posix time 是一種時間表示方式,定義為從格林威治 時間1970年01月...

c 時間型別詳解 time t

原文 unix時間戳 unix timestamp 或稱unix時間 unix time posix時間 posix time 是一種時間表示方式,定義為從格林威治 時間1970年01月01日00時00分00秒起至現在的總秒數。unix時間戳不僅被使用在unix 系統 類unix系統中,也在許多其他...