1. 程式人生 > >根據時間戳得到常見的日期格式

根據時間戳得到常見的日期格式

linux系統幾個常用的時間函式的操作
在學習時間函式之前,需要知道幾個概念
GMT格林尼治標準時間(Greenwich Mean Time),該時間是地球上0經度所在的時間,對應的時區是0時區,北京則位於東八區,也就是說,北京時間比格林尼治標準時間早8個小時。
UTC 協調世界時(Coordinated Universal Time),在計算機系統中,它已經成為一個標準,在不太精確的情況下,UTC時間與GMT時間可以認為是一樣的。
CST 北京時間(Chinese Standard Time),即中國標準時間。
時間戳 一個數字,在linux世界中,時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。


linux提供了幾個函式,來為大家方便地使用UTC時間和CST時間和時間戳。


time(),可以取得當前時間的時間戳。
gmtime(),可以將一個時間戳轉換成一個UTC時間的struct tm的結構體指標。通過該指標,可以方便地得到對應的年月日和時分秒等。gm既是Greenwich Mean的縮寫。
localtime(),可以將一個時間戳轉換成一個當地時間(中國即北京時間)的struct tm的結構體指標。通過該指標,可以方便地得到對應的年月日和時分秒等。
asctime(),返回值是一個字串格式的時間的描述。它的引數是struct tm結構體的指標,它不管這個指標的內容是UTC時間還是北京時間,它僅僅是將其通過字串格式,顯示出來。
ctime(),返回值是一個字串格式的時間的描述。它的引數是一個timt_t的指標,它返回的是時間戳對應的當地時間的字串格式。
mktime(),是localtime()的反操作,將struct tm結構體的指標轉換成一個時間戳。


舉例說明
例子1:獲取當前系統的UTC時間描述
#include <stdio.h>
#include <time.h>

int main(int argc, char ** argv)
{
	printf("process begin at \t[%p]\n", (void*)&main);

	time_t currentTime;
	time(¤tTime);
	printf("current time is \t[%d]\n", currentTime);
	
	struct tm *p_stm = gmtime(¤tTime);
	printf("address of struct tm *p_stm is \t[%p]. pointer to object is \t[%p]\n", &p_stm, p_stm);
	printf("struct tm *p_stm is \t[%d-%.2d-%.2d %.2d:%.2d:%.2d] time_zone is [%s]\n", p_stm->tm_year+1900, p_stm->tm_mon+1, p_stm->tm_mday, p_stm->tm_hour,p_stm->tm_min, p_stm->tm_sec, p_stm->tm_zone);
	
	printf("UTC time is \t[%s]\n", asctime(p_stm));
	
	return 0;
}

程式結果:
process begin at        [0x400594]
current time is         [1498125175]
address of struct tm *p_stm is  [0x7fff2f7aace0]. pointer to object is  [0x390f193420]
struct tm *p_stm is     [2017-06-22 09:52:55] time_zone is [GMT]
UTC time is     [Thu Jun 22 09:52:55 2017
]




例子2:獲取當前系統的本地時間描述

#include <stdio.h>
#include <time.h>

int main(int argc, char ** argv)
{
	printf("process begin at \t[%p]\n", (void*)&main);

	time_t currentTime;
	time(¤tTime);
	printf("current time is \t[%d]\n", currentTime);
	
	struct tm *p_stm = localtime(¤tTime);
	printf("address of struct tm *p_stm is \t[%p]. pointer to object is \t[%p]\n", &p_stm, p_stm);
	printf("struct tm *p_stm is \t[%d-%.2d-%.2d %.2d:%.2d:%.2d] time_zone is [%s]\n", p_stm->tm_year+1900, p_stm->tm_mon+1, p_stm->tm_mday, p_stm->tm_hour,p_stm->tm_min, p_stm->tm_sec, p_stm->tm_zone);
	
	printf("local time is \t[%s]\n", asctime(p_stm));
	
	printf("another way: localtime is \t[%s]\n", ctime(¤tTime));
	
	return 0;
}

程式結果:
process begin at        [0x4005e4]
current time is         [1498125330]
address of struct tm *p_stm is  [0x7fff1d135460]. pointer to object is  [0x390f193420]
struct tm *p_stm is     [2017-06-22 17:55:30] time_zone is [CST]
local time is   [Thu Jun 22 17:55:30 2017
]
another way: localtime is       [Thu Jun 22 17:55:30 2017
]


說明:這個例子使用了兩種方式來顯示當前的本地時間。同時也看到了,asctime()就是僅僅是個顯示結構體的功能,而不去會進行時區轉換。


例子3:獲得2010-01-01 10:08:10秒的時間戳
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
	printf("process begin at \t[%p]\n", (void*)&main);
	
	struct tm p_stm ;
	p_stm.tm_year = 2010 - 1900;
	p_stm.tm_mon = 1 -1;
	p_stm.tm_mday = 1;
	p_stm.tm_hour = 10;
	p_stm.tm_min = 8;
	p_stm.tm_sec = 10;
	
	printf("struct tm is \t[%s]\n",asctime(&p_stm));
	
	time_t t1 = mktime(&p_stm);
	printf("timestamp of 2010-01-01 10:08:10 is \t[%d]\n",t1);
	
	printf("after mktime, time str is \t[%s]\n",ctime(&t1));
	printf("struct tm p_stm is \t[%d-%.2d-%.2d %.2d:%.2d:%.2d] time_zone is [%s]\n", p_stm.tm_year+1900, p_stm.tm_mon+1, p_stm.tm_mday, p_stm.tm_hour,p_stm.tm_min, p_stm.tm_sec, p_stm.tm_zone);

	return 0;
}

程式結果:
process begin at        [0x400594]
struct tm is    [??? Jan  1 10:08:10 2010
]
timestamp of 2010-01-01 10:08:10 is     [1262311690]
after mktime, time str is       [Fri Jan  1 10:08:10 2010
]
struct tm p_stm is      [2010-01-01 10:08:10] time_zone is [CST]


說明:
設定struct tm型別的一個變數的年月日和時分秒之後,就可以用它來得到時間了,因為沒有設定星期,所以,顯示為亂碼。經過mktime之後,該結構體中的其他元素也被修改正確,且計算出一個表示當前時間的一個數字。同時,顯示struct tm型別的變數,可以得到,其對應的時區為CST。