3.3 Linux獲取系統資訊(3、4節)
阿新 • • 發佈:2018-12-14
3.3.3.時間相關API實戰1
3.3.3.1、time
(1)time能得到一個當前時間距離標準起點時間1970-01-01 00:00:00 +0000(UTC)過去了多少秒3.3.3.2、ctime
(1)ctime可以從time_t出發得到一個容易觀察的字串格式的當前時間。(2)ctime好處是很簡單好用,可以直接得到當前時間的字串格式,直接列印來看。壞處是ctime的列印時間格式是固定的,沒法按照我們的想法去變。
(3)實驗結果可以看出ctime函式得到的時間是考慮了計算機中的本地時間的(計算機中的時區設定)
3.3.3.3、gmtime和localtime
(1)gmtime獲取的時間中:年份是以1970為基準的差值,月份是0表示1月,小時數是以UTC時間的0時區為標準的小時數(北京是東8區,因此北京時間比這個時間大8)(2)猜測localtime和gmtime的唯一區別就是localtime以當前計算機中設定的時區為小時的時間基準,其餘一樣。實踐證明我們的猜測是正確的。
#include <stdio.h> #include <time.h> #include <string.h> int main(void) { time_t tNow = -1; struct tm tmNow; // time //tNow = time(NULL); // 返回值 time(&tNow); // 指標做輸出型引數 if (tNow < 0) { perror("time"); return -1; } printf("time: %ld.\n", tNow); // ctime printf("ctime: %s.\n", ctime(&tNow)); // gmtime 和localtime memset(&tmNow, 0, sizeof(tmNow)); gmtime_r(&tNow, &tmNow); printf("年%d月%d日%d時%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour); memset(&tmNow, 0, sizeof(tmNow)); localtime_r(&tNow, &tmNow); printf("年%d月%d日%d時%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour); return 0; }
3.3.4.時間相關API實戰2
3.3.4.1、mktime(1)從OS中讀取時間時用不到mktime的,這個mktime是用來向作業系統設定時間時用的。
3.3.4.2、asctime
(1)asctime得到一個固定格式的字串格式的當前時間,效果上和ctime一樣的。區別是ctime從time_t出發,而asctime從struct tm出發。
3.3.4.3、strftime
(1)asctime和ctime得到的時間字串都是固定格式的,沒法使用者自定義格式
(2)如果需要使用者自定義時間的格式,則需要用strftime。
3.3.4.4、gettimeofday和settimeofday
(1)前面講到的基於time函式的那個系列都是以秒為單位來獲取時間的,沒有比秒更精確的時間。
(2)有時候我們程式希望得到非常精確的時間(譬如以us為單位),這時候就只能通過gettimeofday來實現了。
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>
int main(void)
{
time_t tNow = -1;
struct tm tmNow;
char buf[100];
struct timeval tv = {0};
struct timezone tz = {0};
int ret = -1;
// time
//tNow = time(NULL); // 返回值
time(&tNow); // 指標做輸出型引數
if (tNow < 0)
{
perror("time");
return -1;
}
printf("time: %ld.\n", tNow);
// ctime
printf("ctime: %s.\n", ctime(&tNow));
#if 0
// gmtime 和localtime
memset(&tmNow, 0, sizeof(tmNow));
gmtime_r(&tNow, &tmNow);
printf("年%d月%d日%d時%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
memset(&tmNow, 0, sizeof(tmNow));
localtime_r(&tNow, &tmNow);
printf("年%d月%d日%d時%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
#endif
#if 0
// asctime
memset(&tmNow, 0, sizeof(tmNow));
localtime_r(&tNow, &tmNow);
printf("年%d月%d日%d時%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
printf("asctime:%s.\n", asctime(&tmNow));
#endif
#if 0
// strftime
memset(&tmNow, 0, sizeof(tmNow));
localtime_r(&tNow, &tmNow);
printf("年%d月%d日%d時%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
memset(buf, 0, sizeof(buf));
strftime(buf, sizeof(buf), "%Y * %m * %d, %H-%M-%S.", &tmNow);
printf("時間為:[%s].\n", buf);
#endif
// gettimeofday
ret = gettimeofday(&tv, &tz);
if (ret < 0)
{
perror("gettimeofday");
return -1;
}
printf("seconde: %ld.\n", tv.tv_sec);
printf("timezone:%d.\n", tz.tz_minuteswest);
return 0;
}