Linux C 獲取格式化的日期時間
概述
世界標準時間(Coordinated Universal Time,UTC),也就是大家所熟知的格林威治標準時間(Greenwich Mean Time,GMT)。世界各地時間也世界標準時間為基準劃分為不同的時區,例如,中國的北京時間與UTC的時差為+8,也就是UTC+8。美國是UTC-5。 Calendar Time:日曆時間,是用“從一個標準時間點到此時的時間經過的秒數”來表示的時間。無論哪一個時區,在同一時刻對同一個標準時間點來說,日曆時間都是一樣的。日曆時間返回自1970-1-1:00:00:00以來所經過的秒數累計值。 跟日期時間相關的shell命令 $ date // 顯示當前日期1.2 跟日期時間有關的資料結構
1.2.1 clock_t 結構
程式開始執行到此時所經過的CPU時鐘計時單元數用clock資料型別表示。 typedef long clock_t; #define CLOCKS_PER_SEC ((clock_t)1000) // 每個時鐘單元是1毫秒1.2.2 time_t 結構
日曆時間(Calendar Time)是通過time_t資料型別來表示的,用time_t表示的時間(日曆時間)是從一個時間點(1970年1月1日0時0分0秒)到此時的秒數。 typedef long time_t; // 時間值1.2.3 tm結構
通過tm結構來獲得日期和時間 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日 */ int tm_isdst; /* 夏令時識別符號,夏令時tm_isdst為正;不實行夏令時tm_isdst為0;*/ };1.2.4 tms結構
儲存著一個程序及其子程序使用的CPU時間 struct tms{ clock_t tms_utime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_cstime; }1.2.5 Utimbuf結構
struct utimbuf{ time_t actime; // 存取時間 time_t modtime; // 修改時間 } 檔案的時間 st_atime 檔案資料的最後存取時間 st_mtime 檔案資料的最後修改時間 st_ctime 檔案資料的建立時間1.2.5 timeval結構
struct timeval{
time_t tv_sec;
susecond_t tv_usec; //當前妙內的微妙數
};
1.2.6 timer_struct結構
struct timer_struct {unsigned long expires; //定時器被啟用的時刻
void (*fn)(void); //定時器啟用後的處理函式 }
1.3 跟日期時間相關的函式
1.3.1 clock函式
#include <time.h> clock_t clock(void); 返回從程式開始執行到程式中呼叫clock()函式之間的CPU時鐘計時單元數 例 1:clock函式的例子 $ vi clock.c #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { long loop = 10000000L; double duration; clock_t start, end; printf("Time to do %ld empty loops is ", loop); start = clock(); while(loop--) ; end = clock(); duration = (double)(end-start)/CLOCKS_PER_SEC; printf("%f seconds\n", duration); return(0); } 編譯、執行: $ gcc clock.c -o clock $ ./clock Time to do 10000000 empty loops is 0.220000 seconds1.3.2 time函式
日曆時間 #include <time.h> time_t time(time_t *calptr); 返回自1970-1-1:00:00:00以來經過的秒數累計值 例 2:time函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now; time(&now); printf("now time is %d\n", now); return(0); } 編譯、執行: $ gcc time.c -o time $ ./time now time is 11936881481.3.3 times函式
程式執行的時間 #include <sys/times.h> clock_t times(struct tms *buf); 返回自系統自舉後經過的時鐘滴答數 例 3:times函式的例子 #include <stdio.h> #include <sys/times.h> int main(void) { int i; clock_t start, end; struct tms tms_start, tms_end; start = times(&tms_start); end = times(&tms_end); printf("start clock time : %d\n", start); printf("end clock time : %d\n", end); return(0); } 編譯、執行: $ gcc times.c -o times $ ./times Start clock time : 1720654909 End clock time : 17206549091.3.4 localtime函式
將日曆時間變換成本地時間,考慮到本地時區和夏令時標誌。 #include <time.h> struct tm *localtime(const time_t * calptr); 例 4:localtime函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now; struct tm *tm_now; time(&now); tm_now = localtime(&now); printf("now datetime: %d-%d-%d %d:%d:%d\n", tm_now->tm_year, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec); return(0); } 編譯、執行: $ gcc localtime.c -o localtime $ ./localtime now datetime: 107-9-30 5:11:431.3.5 gmtime函式
將日曆時間變換成國際標準時間的年月日分秒 #include <time.h> struct tm *gmtime(const time_t *calptr); 例 5:gmtime函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now; struct tm *tm_now; time(&now); tm_now = gmtime(&now); printf("now datetime: %d-%d-%d %d:%d:%d\n", tm_now->tm_year, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec); return(0); } 編譯、執行: $ gcc gmtime.c -o gmtime $ ./gmtime now datetime: 107-9-29 21:15:261.3.6 mktime函式
以本地時間的年月日為引數,將其變換成time_t值 #include <time.h> time_t mktime(struct tm *tmptr); 例 6:mktime函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now, new_time; struct tm *tm_now; time(&now); printf("now time is %ld\n", now); tm_now = localtime(&now); new_time = mktime(tm_now); printf("new time is %ld\n", new_time); return(0); } 編譯、執行: $ gcc mktime.c -o mktime $ ./mktime now time is 1193692806 new time is 11936928061.3.7 asctime函式
產生形式的26位元組字串,引數指向年月日等字串的指標。與date命令輸出形式類似 #include <time.h> char *asctime(const struct tm *tmptr); 例 7:astime函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now; struct tm *tm_now; char *datetime; time(&now); tm_now = localtime(&now); datetime = asctime(tm_now); printf("now datetime: %s\n", datetime); return(0); } 編譯、執行: $ gcc asctime.c -o asctime $ ./asctime now datetime: Tue Oct 30 05:22:21 20071.3.8 ctime函式
產生形式的26位元組字串,引數指向日曆時間的指標。 #include <time.h> char *ctime(const time_t *calptr); 例 8:ctime函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now; char *datetime; time(&now); datetime = ctime(&now); printf("now datetime: %s\n", datetime); return(0); } 編譯、執行: $ gcc ctime.c -o ctime $ ./ctime now datetime: Tue Oct 30 05:23:45 20071.3.9 strftime函式
格式化時間輸出 #include <time.h> size_t strftime(char *buf,size_t maxsize,const char *format,const struct tm *tmptr); %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) %x 標準的日期串 %X 標準的時間串 %y 不帶世紀的十進位制年份(值從0到99) %Y 帶世紀部分的十進位制年份 %z,%Z 時區名稱,如果不能得到時區名稱則返回空字元。 %% 百分號 例 9:strftime函式的例子 #include <stdio.h> #include <time.h> int main(void) { time_t now; struct tm *tm_now; char datetime[200]; time(&now); tm_now = localtime(&now); strftime(datetime, 200, "%x %X %n%Y-%m-%d %H:%M:%S %nzone: %Z\n", tm_now); printf("now datetime : %s\n", datetime); return(0); } 編譯、執行: $ gcc strftime.c -o strftime ]$ ./strftime now datetime : 10/30/07 05:41:47 2007-10-30 05:41:47 zone: CST1.3.10 utime函式
更改檔案的存取和修改時間 #include <time.h> int utime(const char pathname, const struct utimbuf *times) ; 返回值:成功返回0,失敗返回-1 times 為空指標,存取和修改時間設定為當前時間 例 10:utime函式的例子 #include <stdio.h> #include <time.h> int main(int argc, char *argv[]) { if(argc < 2){ fprintf(stderr, "Error: usging command file_path"); exit(1); } utime(argv[1], NULL); return(0); } 編譯、執行: $ touch file1 $ ls -al file1 // 先建立一個檔案file1,檢視一下他的建立時間 -rw-r--r-- 1 hongdy hongdy 3431 05-01 05:59 file1 $ gcc utime.c –o utime $ ./utime file1 $ ls -al file1 -rw-r--r-- 1 hongdy hongdy 3431 05-01 06:00 file11.3.11 gettimeofday函式
取得目前的時間
#include <time.h> int gettimeofday ( struct& nbsptimeval * tv , struct timezone * tz ); 函式說明 gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的資訊則放到tz所指的結構中。timeval結構定義為:
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
timezone 結構定義為:
struct timezone{
int tz_minuteswest; /*和Greenwich 時間差了多少分鐘*/
int tz_dsttime; /*日光節約時間的狀態*/
};
上述兩個結構都定義在/usr/include/sys/time.h。tz_dsttime 所代表的狀態如下
DST_NONE /*不使用*/
DST_USA /*美國*/
DST_AUST /*澳洲*/
DST_WET /*西歐*/
DST_MET /*中歐*/
DST_EET /*東歐*/
DST_CAN /*加拿大*/
DST_GB /*大不列顛*/
DST_RUM /*羅馬尼亞*/
DST_TUR /*土耳其*/
DST_AUSTALT /*澳洲(1986年以後)*/
返回值 成功則返回0,失敗返回-1,錯誤程式碼存於errno。附加說明EFAULT指標tv和tz所指的記憶體空間超出存取許可權。 times 為空指標,存取和修改時間設定為當前時間 例 10:gettimeofday函式的例子 #include<sys/time.h>
#include<unistd.h>
main(){
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);
printf(“tv_sec; %d\n”, tv,.tv_sec)
printf(“tv_usec; %d\n”,tv.tv_usec);
printf(“tz_minuteswest; %d\n”, tz.tz_minuteswest);
printf(“tz_dsttime, %d\n”,tz.tz_dsttime);
} 編譯、執行: tv_usec:136996
tz_minuteswest:-540
tz_dsttime:0 tv_sec: 974857339
1.3.12 settimeofday函式
設定目前時間
#include<sys/time.h>#include<unistd.h>
int settimeofday ( const& nbspstruct timeval *tv,const struct timezone *tz);
函式說明 settimeofday()會把目前時間設成由tv所指的結構資訊,當地時區資訊則設成tz所指的結構。詳細的說明請參考gettimeofday()。注意,只有root許可權才能使用此函式修改時間。
返回值 成功則返回0,失敗返回-1,錯誤程式碼存於errno。
錯誤程式碼 EPERM 並非由root許可權呼叫settimeofday(),許可權不夠。
EINVAL 時區或某個資料是不正確的,無法正確設定時間。 times 為空指標,存取和修改時間設定為當前時間 例 12:settimeofday函式的例子 /************************************************
設定作業系統時間
引數:*dt資料格式為"2006-4-20 20:30:30"
呼叫方法:
char *pt="2006-4-20 20:30:30";
SetSystemTime(pt);
**************************************************/
int SetSystemTime(char *dt)
{
struct rtc_time tm;
struct tm _tm;
struct timeval tv;
time_t timep;
sscanf(dt, "%d-%d-%d %d:%d:%d", &tm.tm_year,
&tm.tm_mon, &tm.tm_mday,&tm.tm_hour,
&tm.tm_min, &tm.tm_sec);
_tm.tm_sec = tm.tm_sec;
_tm.tm_min = tm.tm_min;
_tm.tm_hour = tm.tm_hour;
_tm.tm_mday = tm.tm_mday;
_tm.tm_mon = tm.tm_mon - 1;
_tm.tm_year = tm.tm_year - 1900;
timep = mktime(&_tm);
tv.tv_sec = timep;
tv.tv_usec = 0;
if(settimeofday (&tv, (struct timezone *) 0) < 0)
{
printf("Set system datatime error!\n");
return -1;
}
return 0;
}
相關推薦
Linux C 獲取格式化的日期時間
概述 世界標準時間(Coordinated Universal Time,UTC),也就是大家所熟知的格林威治標準時間(Greenwich Mean Time,GMT)。世界各地時間也世界標準時間為基準劃分為不同的時區,例如,中國的北京時間與UTC的時差為+8,也就是UTC+8。美國是UTC-5。 Cal
c#獲取當前日期時間以及格式化操作
我們可以通過使用DataTime這個類來獲取當前的時間。通過呼叫類中的各種方法我們可以獲取不同的時間:如:日期(2008-09-04)、時間(12:12:12)、日期+時間(2008-09-04 12:11:10)等。 //獲取日期+時間 DateTime.Now.T
C#獲取當前日期時間(轉)
num minutes ron time() mon 當前日期 sql cond rtti //獲取日期+時間DateTime.Now.ToString(); // 2008-9-4 20:02:10DateTime.Now.ToLocalTime()
C#獲取當前日期時間
local bsp short con sda etime months 調用 tof 我們可以通過使用DataTime這個類來獲取當前的時間。通過調用類中的各種方法我們可以獲取不同的時間:如:日期(2008-09-04)、時間(12:12:12)、日期+時間(2008-0
Linux shell 獲取當前日期/時間
當前日期 [[email protected] DFJR-ERP]# cur_date=”date +%Y-%m-%d” [[email protected] DFJR-E
linux c獲取系統啟動時間
sysinfo 函式原型 int sysinfo(struct sysinfo *info); ##獲取系統相關資訊結構體 sysinfo 結構體說明 struct sysinfo {
ASP.NET C# 獲取當前日期 時間 年 月 日 時 分 秒
//獲取日期+時間 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToString(); // 2008-9-4 20:12:12 //獲取日期 DateTime.Now.T
C#獲取網路日期時間
【1】獲取網路日期時間 /// <summary> /// 獲取網路日期時間 /// </summary> /// <returns></returns>
C# 獲取當前日期,時間、季度
當前日期 starty clas nth parse var div tar bsp 1 DateTime dt = DateTime.Now; //當前時間 2 DateTime startWeek = dt.AddDays(1 - Convert.ToInt
linux-c獲取utc時間,並轉為BCD碼格式
原始碼: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> void UtcBcdTime(char* utc_buf) {
Linux C獲取時間函式例項
例項詳解Linux下C獲取時間函式的程式碼。 一、time 標頭檔案: #include <time.h> 原型: time_t time(time_t *t) time_t的定義: typedef __darwin_time_t time_t; typedef long
Shell指令碼獲取格式化日期與時間總結
!/bin/sh upload logs to hdfs source /etc/profile 獲取昨天日期 yyyyMMdd 格式 yesterday=date --date='1 days ago' +%Y%m%d 獲取昨天日期 yyyy-MM-dd 格式
linux c獲取系統時間戳
#include<iostream> #include <stdlib.h> #include <stdio.h> #include <sys/time.h> #include <unistd.h> int main(){ struc
js根據時間戳獲取格式化日期
//格式化時間戳(毫秒) function getFormatDate(timestamp) { var newDate = new Date(timestamp); Date.prototype.fo
c++獲取當前系統時間並格式化輸出
#include <string> #include <time.h> using namespace std; string getTime() { time_t timep; time (&timep); char
C#.NET 獲取各種日期時間
DateTime dt = DateTime.Now; //當前時間 DateTime startWeek = dt.AddDays(1 - Convert.ToInt32(dt.DayOfWeek.ToString("d"))); //本週週一 DateTime e
Linux下用C獲取當前系統時間
#include <time.h> time_t time(time_t calptr); 返回的是日曆時間,即國際標準時間公元1970年1月1日00 : 00 : 00以來經過的秒數。然後再呼叫 char *ctime(const
js 獲取當前日期時間,將當前時間進行各種 格式化
Date.prototype.format = function (format) { var args = { "M+": this.getMonth() + 1, "d+": this.getDate(),
C#實戰小技巧(四):獲取當前日期時間
我們可以通過使用DataTime這個類來獲取當前的時間。通過呼叫類中的各種方法我們可以獲取不同的時間:如:日期(2008-09-04)、時間(12:12:12)、日期+時間(2008-09-04 12:11:10)等。 //獲取日期+時間 DateTime.Now.To
js獲取當前日期時間
style col 分鐘 date nds 獲取時間 log code time var myDate=new Date(); myDate.getFullYear();//獲取當前年份(4位) myDate.getMonth();// 獲取當前的月份,但是需要+1因為