c语言计算据标准时间多少天,C语言系列--时间处理
首先明確幾個概念
UTC 協調世界時,又稱世界標準時間或世界協調時間。
GMT 格林尼治平均時間或格林尼治標準時間,由于地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林威治時間已經不再被作為標準時間使用
日歷時間,是用“從一個標準時間點到此時的時間經過的秒數”來表示的時間。
計時
clock()
函數功能:返回當前時刻程序運行的時間(user time + system time),其結果為時鐘計數器值(也叫時鐘滴答數)。
函數原型:clock_t clock(void);
兩次調用 clock() 之間的差就是程序執行所用的時鐘滴答數。將其轉換為秒的公式為:
result / CLOCKS_PER_SEC
如果 CLOCKS_PER_SEC 的值大于 1, 你可以得到精確度小于秒的計時。 注意, clock() 返回的是執行程序使用的處理器的時間, 在多任務系統下,
有可能和真實的時間相差很多。
例:
#include "stdio.h"
#include "time.h"
int main( void )
{
long num = 90000000L;
long sum = 0;
clock_t start, finish;
double duration;
/* 測量一個事件持續的時間*/
start = clock();
for(long i = 0; i < num; i++ ) {
sum += i;
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
return 0;
}
運行結果:
0.350000 seconds ? (不同機器運行結果會有所不同)
相關結構體
tm結構
在time.h中的定義:
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; ? // 日期 - 取值區間為[0, 365], 從 1月1日開始
int tm_isdst; ?// 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst為負。
};
獲取日歷時間
time()
函數功能:返回從標準計時點(一般是1970年1月1日午夜)到當前時間的秒數。
函數原型:time_t time(time_t* timer)
例:
#include "stdio.h"
#include "time.h"
int main( void )
{
time_t time1;
time(&time1);//或者改為這種方式 time1 = time(NULL);
printf("%ld\n", time1);
return 0;
}
運行結果
1438327852
獲取固定的時間格式
asctime()
函數功能: 得到機器時間(日期時間轉換為ASCII碼)
函數原型: char* asctime(struct tm * ptr)
參數說明: 結構指針ptr應通過函數localtime()或gmtime()得到
ctime()
函數原型: char *ctime(const time_t *time)
函數功能: 得到日歷時間
參數說明: time-該參數應由函數time獲得
我們可以通過asctime()函數和ctime()函數將時間以固定的格式顯示出來,兩者的返回值都是char*型的字符串。返回的時間格式為: 星期幾 月份 日期 時:分:秒 年\n\0
例如:Wed Jan 02 02:03:55 1980\n\0
其中:\n是一個換行符,\0是一個空字符,表示字符串結束。下面是兩個函數的原型:
asctime()函數是通過tm結構來生成具有固定格式的保存時間信息的字符串,而ctime()是通過日歷時間來生成時間字符串。
asctime()函數只是把tm結構對象中的各個域填到時間字符串的相應位置就行了,而ctime()函數需要先參照本地的時間設置,把日歷時間轉化為本地時間,然后再生成格式化后的字符串。
在下面,如果t是一個非空的time_t變量的話,那么:
printf(ctime(&t));
等價于:
printf(asctime(localtime(&t)));
例:
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt = time(NULL);
ptr = gmtime(
printf(asctime(ptr));
printf(ctime(
return 0;
}
運行結果:
Fri Jul 31 09:26:53 2015
Fri Jul 31 17:26:53 2015
獲得日期和時間
gmtime()
函數功能:將日歷時間轉化為世界標準時間(即格林尼治時間GMT)并返回一個tm結構體來保存這個時間
函數原型:struct tm * gmtime(const time_t *timer);
localtime()
函數功能:將日歷時間轉化為本地時間。
函數原型:struct tm * localtime(const time_t * timer);
如現在用gmtime()函數獲得的世界標準時間是2005年7月30日7點18分20秒,那么我用 localtime()函數在中國地區獲得的本地時間會比世界標準時間晚8個小時,即2005年7月30日15點18分20秒。
例:
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *local;
time_t timep;
time(&timep);
local = localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local = gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}
運行結果是:
Local hour is: 15
UTC hour is: 7
自定義時間格式
strftime()
函數功能:函數將時間格式化為我們想要的格式。它的原型如下:
函數原型:size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
我們可以根據format指向字符串中格式命令把timeptr中保存的時間信息放在strDest指向的字符串中,最多向strDest中存放 maxsize 個字符。該函數返回向strDest指向的字符串中放置的字符數。
注意:maxsize的長度應該包含'\0'
函數strftime()的操作有些類似于sprintf():識別以百分號(%)開始的格式命令集合,格式化輸出結果放在一個字符串中。格式化命令說明串strDest中各種日期和時間信息的確切表示方法。格式串中的其他字符原樣放進串中。格式命令列在下面,它們是區分大小寫的。
%a 星期幾的英文簡寫 (如:Sat)
%A 星期幾的英文全稱 (如:Saturday)
%b 月分的英文簡寫 (如:Aug)
%B 月份的英文全稱 (如:August)
%h 簡寫的月份名(如:Aug)
%D 月/天/年(如 08/01/15)
%F 年-月-日(如:2015-08-01)
%j 十進制表示的每年的第幾天 (如:213)
%Y 帶公元的年(4位數, 如:2015)
%m 十進制表示的月份(如:08)
%d 十進制表示的每月的第幾天(2位數, 如:01)
%T 顯示時分秒:hh:mm:ss (如:15:01:01)
%R 顯示小時和分鐘:hh:mm(如:15:01)
%H 24小時制的小時 (如:15)
%I 12小時制的小時 ?(如:03) %M 十時制表示的分鐘數(如:01)
%S 十進制的秒數(如:01)
%p 本地的AM或PM的等價顯示(返回AM或PM)
%r 12小時的時間(如:03:31:23 PM)
%V 每年的第幾周,使用基于周的年(如:31)
%w 十進制表示的星期幾(值從0到6,星期天為0)
%c 標準的日期的時間串
%C 年份的后兩位數字
%g 年份的后兩位數字,使用基于周的年
%G 年分,使用基于周的年
%e 在兩字符域中,十進制表示的每月的第幾天
%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)
%U 第年的第幾周,把星期日做為第一天(值從0到53)
%W 每年的第幾周,把星期一做為第一天(值從0到53)
%x 標準的日期串
%X 標準的時間串
%y 不帶世紀的十進制年份(如:15)
%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符(如+0800)。
例:
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t timep;
char str[20];
timep ?= time(NULL);
ptr = localtime(&timep);
strftime(str, 20, "%F %T", ptr);
printf("%s\n", str);
strftime(str, 20, "%Y-%m-%d %R:%S", ptr);
printf("%s\n", str);
strftime(str, 20, "%Y-%m-%d %H:%M:%S", ptr);
printf("%s\n", str);
return 0;
}
運行結果:
2015-08-01 15:39:39
2015-08-01 15:39:39
2015-08-01 15:39:39
計算時間間隔
difftime();
函數功能:返回兩個time_t型變量之間的時間間隔,即 計算兩個時刻之間的時間差。
但它只能精確到秒。
函數原型:double difftime(time_t time2, time_t time1);
例:
#include "time.h"
#include "stdio.h"
#include
int main(void)
{
time_t start, end;
start = time(NULL);
sleep(2);
end = time(NULL);
printf("used %f seconds.\n",difftime(end,start));
return 0;
}
運行結果:
used 2.000000 seconds.
sleep()
頭文件:#include
函數功能:sleep()會令目前的進程暫停,直到達到參數seconds所指定的時間,或是被信號所中斷。
函數原型:unsigned int sleep(unsigned int seconds);
函數返回值:若進程暫停到參數seconds所指定的時間則返回0,若有信號中斷則返回剩余秒數
分解時間轉化為日歷時間
mktime();
函數功能:將用tm結構表示的時間轉化為日歷時間,注意時間在1970年1月1日之后才行
函數原型:
time_t mktime(struct tm * timeptr);
例:
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm timep;
time_t timp2;
int year = 2015;
int month = 8;
int day = 1;
int hour = 18;
int min = 17;
int sec = 16;
char datetimeStr[20];
timep.tm_year = year - 1900;
timep.tm_mon = month;
timep.tm_mday = day;
timep.tm_hour = hour;
timep.tm_min = min;
timep.tm_sec = sec;
timep.tm_isdst = 0;
timp2 = mktime(&timep);
strftime(datetimeStr, 20, "%F %T", localtime(&timp2));
printf("%s\n", datetimeStr);
return 0;
}
運行結果:
2015-09-01 18:17:16
總結
以上是生活随笔為你收集整理的c语言计算据标准时间多少天,C语言系列--时间处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python素材和代码_python之文
- 下一篇: 1014 福尔摩斯的约会 (20分)