1. 程式人生 > >獲取並顯示當前時間

獲取並顯示當前時間

一、首先,我們要分清楚幾個概念:
1、Coordinated Universal Time(UTC):協調世界時,又稱為世界標準時間,也就是格林威治標準時間(Greenwich Mean Time,GMT)。比如,中國內地的時間與UTC的時差為+8,也就是UTC+8。美國是UTC-5。以年、月、日、時、分、秒錶示

2、Calendar Time:日曆時間,是用“從一個標準時間點(如:1970年1月1日0時0分0秒)到此時的時間經過的秒數”來表示的時間。可以說日曆時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個標準時間點來說,日曆時間都是一樣的。 以秒錶示

3、local time:當地時間

:中國就是北京時間

二、與日期和時間相關的資料結構
在標準C/C++中,我們可通過tm結構來獲得日期和時間,tm結構在time.h中的定義如下:

#ifndef _TM_DEFINED
struct tm {
 int tm_sec;   /* 秒 – 取值區間為[0,59] */
 int tm_min;   /* 分 - 取值區間為[0,59] */
 int tm_hour;  /* 時 - 取值區間為[0,23] */
 int tm_mday;  /* 一個月中的日期 - 取值區間為[1,31] */
 int tm_mon;   /* 月份(0代表一月)取值區間為[0,11] */
 int tm_year;   /* 年份,其值等於實際年份減去1900 */
int tm_wday; /* 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 */ int tm_yday; /* 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */ int tm_isdst; /* 夏令時識別符號,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不瞭解情況時,tm_isdst()為負。*/ #define _TM_DEFINED #endif

ANSI C標準稱使用tm結構的這種時間表示為分解時間(broken-down time)。

日曆時間(Calendar Time)是通過time_t資料型別

來表示的,用time_t表示的時間(日曆時間)是從一個時間點(例如:1970年1月1日0時0分0秒)到此時的秒數。在time.h中,我們也可以看到time_t是一個長整型數

#ifndef _TIME_T_DEFINED
typedef long time_t;      /* 時間值 */
#define _TIME_T_DEFINED;  /* 避免重複定義 time_t */
#endif

與時間日期相關的函式:

    asctime(); 將時間和日期以字串格式表示,只是把tm結構物件中的各個域**填到時間字串的相應位置**,可顯示世界時間和本地時間
    ctime(); 把日期和時間轉換為字串   自動把世界時間轉化為本地時間再顯示
    gmtime(); 把日期和時間轉換為(GMT)時間
    localtime(); 取得當地目前時間和日期
    mktime(); 將時間結構資料轉換成經過的秒數
    strftime(); 將時間格式化
    time(); 取得日曆時間:從1970年1月1日0時0分0秒到此時的秒數" 執行的結果與當時的時間有關
    strftime();將時間格式化為我們想要的格式
    clock(); 確定處理器時間  可用來計算某段程式執行的時間
    difftime(); 計算兩個時刻之間的時間差

程式如下:

#include <iostream>
#include <time.h>  /* time_t, struct tm, time,                                                  localtime, asctime */

using namespace std;

int main()
{
    /*————————————獲得日曆時間——————————————————————*/
    time_t rawtime;
    time(&rawtime);   
    cout  << time(&rawtime) << endl;   

    /*————————轉換日曆時間,獲得世界時間和當地時間————————*/
    struct tm * timeinfo;
    timeinfo = localtime(&rawtime);  
    cout << "localtime  當地時間:" << timeinfo->tm_hour << endl;
    timeinfo = gmtime(&rawtime);  
    cout << "gmtime  世界時間:" << timeinfo->tm_hour << endl << endl;

    /*——————————將時間以固定格式顯示  如:Wed Jan 02 02:03:55 1980/n/0——————————————————————*/
    cout << "asctime 顯示時間(當地、世界)" << asctime(timeinfo) << endl;// 
    cout << "ctime 自動把世界時間轉化為本地時間再顯示 "<<ctime(&rawtime) << endl;

    /*————————————自定義時間格式——————————————————————*/
    cout << timeinfo->tm_hour << ":" << timeinfo->tm_min << ":" << timeinfo->tm_sec << endl;

    char   pblgtime[20];
    strftime(pblgtime, 20, "%Y-%m-%d %X", localtime(&rawtime));
    cout << "strftime   " << pblgtime << endl;
    return 0;

執行結果:這裡寫圖片描述
其中函式strftime()的操作有些類似於sprintf():識別以百分號(%)開始的格式命令集合,格式化輸出結果放在一個字串中。格式化命令說明串strDest中各種日期和時間資訊的確切表示方法。格式串中的其他字元原樣放進串中。格式命令列在下面,它們是區分大小寫的。

%a 星期幾的簡寫
%A 星期幾的全稱
%b 月分的簡寫
%B 月份的全稱
%c 標準的日期的時間串
%C 年份的後兩位數字
%d 十進位制表示的每月的第幾天
%D 月/天/年
%e 在兩字元域中,十進位制表示的每月的第幾天
%F 年-月-日
%g 年份的後兩位數字,使用基於周的年
%G 年分,使用基於周的年
%h 簡寫的月份名
%H 24小時制的小時
%I 12小時制的小時
%j 十進位制表示的每年的第幾天
%m 十進位制表示的月份
%M 十時製表示的分鐘數
%n 新行符
%p 本地的AM或PM的等價顯示
%r 12小時的時間
%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 時區名稱,如果不能得到時區名稱則返回空字元。
%% 百分號