LINUX C系統程式設計與PYTHON中的時間模組對比
今天看python時間模組time的時候發現和LINUX系統程式設計中的時間呼叫函式基本一樣,以前剛好沒有好好學習LINUX C程式設計的時間模組就對比進行了學習。
- 本文只是給出函式介面和使用方式,詳細瞭解請參考LINUX main page和PYTHON help
- 本文不涉及asctime和ctime,並且C中涉及多執行緒程式設計注意選擇可重入性函式
一、時間存在方式
其實不管是C還是PYTHON這裡都包含3種時間不同存在的方式
- 日曆時間:Epoch以來的秒及新紀元時間(1970年1月1日 00:00:00)以來的秒
- 分解時間:實際上是時間在程式內部存在的結構,也是一箇中間介質,C中使用結構體,PYTHON中使用元組
- LINUX C為tm結構體:
struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ /* >0 DST is in effect =0 DST is not effect; <0 DST information not available */ };
- PYTHON struct_time元組:
索引(Index) 屬性(Attribute) 0 tm_year(年) 1 tm_mon(月) 2 tm_mday(日) 3 tm_hour(時) 4 tm_min(分) 5 tm_sec(秒) 6 tm_wday(weekday) 7 tm_yday(一年中的第幾天) 8 tm_isdst(是否是夏令時)
可以看到他們基本是一致的
- 可讀時間:這種一般就是我們平時看到的一些方便讀取的的時間,比如
2017-10-12 06:52:03(AM) +0800
就是方便人類讀取的可讀取時間
LINUX C可讀時間格式:
%a The abbreviated weekday name according to the current locale. %A The full weekday name according to the current locale. %b The abbreviated month name according to the current locale. %B The full month name according to the current locale. %c The preferred date and time representation for the current locale. %C The century number (year/100) as a 2-digit integer. (SU) %d The day of the month as a decimal number (range 01 to 31). %D Equivalent to %m/%d/%y. (Yecch—for Americans only. Americans should note that in other countries %d/%m/%y is rather common. This means that in international context this format is ambiguous and should not be used.) (SU) %e Like %d, the day of the month as a decimal number, but a leading zero is replaced by a space. (SU) %E Modifier: use alternative format, see below. (SU) %F Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99) %G The ISO 8601 week-based year (see NOTES) with century as a decimal number. The 4-digit year corresponding to the ISO week number (see %V). This has the same format and value as %Y, except that if the ISO week number belongs to the previous or next year, that year is used instead. (TZ) %g Like %G, but without century, that is, with a 2-digit year (00-99). (TZ) %h Equivalent to %b. (SU) %H The hour as a decimal number using a 24-hour clock (range 00 to 23). %I The hour as a decimal number using a 12-hour clock (range 01 to 12). %j The day of the year as a decimal number (range 001 to 366). %k The hour (24-hour clock) as a decimal number (range 0 to 23); single digits are preceded by a blank. (See also %H.) (TZ) %l The hour (12-hour clock) as a decimal number (range 1 to 12); single digits are preceded by a blank. (See also %I.) (TZ) %m The month as a decimal number (range 01 to 12). %M The minute as a decimal number (range 00 to 59). %n A newline character. (SU) %O Modifier: use alternative format, see below. (SU) %p Either "AM" or "PM" according to the given time value, or the corresponding strings for the current locale. Noon is treated as "PM" and midnight as "AM". %P Like %p but in lowercase: "am" or "pm" or a corresponding string for the current locale. (GNU) %r The time in a.m. or p.m. notation. In the POSIX locale this is equivalent to %I:%M:%S %p. (SU) %R The time in 24-hour notation (%H:%M). (SU) For a version including the seconds, see %T below. %s The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). (TZ) %S The second as a decimal number (range 00 to 60). (The range is up to 60 to allow for occasional leap seconds.) %t A tab character. (SU) %T The time in 24-hour notation (%H:%M:%S). (SU) %u The day of the week as a decimal, range 1 to 7, Monday being 1. See also %w. (SU) %U The week number of the current year as a decimal number, range 00 to 53, starting with the first Sunday as the first day of week 01. See also %V and %W. %V The ISO 8601 week number (see NOTES) of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4 days in the new year. See also %U and %W. (SU) %w The day of the week as a decimal, range 0 to 6, Sunday being 0. See also %u. %W The week number of the current year as a decimal number, range 00 to 53, starting with the first Monday as the first day of week 01. %x The preferred date representation for the current locale without the time. %X The preferred time representation for the current locale without the date. %y The year as a decimal number without a century (range 00 to 99). %Y The year as a decimal number including the century. %z The +hhmm or -hhmm numeric timezone (that is, the hour and minute offset from UTC). (SU) %Z The timezone name or abbreviation. %+ The date and time in date(1) format. (TZ) (Not supported in glibc2.) %% A literal '%' character.
python 可讀時間格式:
%Y Year with century as a decimal number. %m Month as a decimal number [01,12]. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %M Minute as a decimal number [00,59]. %S Second as a decimal number [00,61]. %z Time zone offset from UTC. %a Locale's abbreviated weekday name. %A Locale's full weekday name. %b Locale's abbreviated month name. %B Locale's full month name. %c Locale's appropriate date and time representation. %I Hour (12-hour clock) as a decimal number [01,12]. %p Locale's equivalent of either AM or PM. Other codes may be available on your platform. See documentation for the C library strftime function.
本文使用這三個術語
二、日曆時間
下面方法獲取當前系統時間的當前時間
-
LINUX C:
int gettimeofday(struct timeval *tv,struct timezone *tz);
time_t time(time_t *timep) -
PYTHON:
time.time()
上面的方式都是獲取當前時間的日曆時間的方式為了方便我們使用time方法
三、日曆時間轉換為分解時間
-
LINUX C:
strcut tm* gmtime(const time_t* timep);
strcut tm* localtime(const time_t* timep);
Each of these functions returns the value described, or NULL in case an error was detected.
-
PYTHON:
time.gmtime(seconds=None)
time.localtime(seconds=None)
可以看到他們是一致的其中gmtime代表返回UTC時間,而localtime代表返回本地時區時間
四、將分解時間轉換為日曆時間
-
LINUX C:
time_t mktime(struct tm* tmieptr)
RETURN VALUE -1 in case of mktime() in case an error was detected.
-
PYTHON:
time.mktime(p_tuple)
五、將分解時間轉換為可讀時間
-
LINUX C:
size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);
RETURN VALUE Provided that the result string, including the terminating null byte, does not exceed max bytes, strftime() returns the number of bytes (excluding the ter‐ minating null byte) placed in the array s. If the length of the result string (including the terminating null byte) would exceed max bytes, then strf‐ time() returns 0, and the contents of the array are undefined. (This behavior applies since at least libc 4.4.4; very old versions of libc, such as libc 4.4.1, would return max if the array was too small.) Note that the return value 0 does not necessarily indicate an error. For example, in many locales %p yields an empty string. An empty format string will likewise yield an empty string.
-
PYTHON:
strftime(format, p_tuple=None)
這裡需要注意format,format在文章開頭已經給出
六、將可讀時間轉換為分解時間
-
LINUX C:
char *strptime(const char *s, const char *format, struct tm *tm);
RETURN VALUE The return value of the function is a pointer to the first character not processed in this function call. In case the input string contains more charac‐ ters than required by the format string the return value points right after the last consumed input character. In case the whole input string is consumed the return value points to the null byte at the end of the string. If strptime() fails to match all of the format string and therefore an error occurred the function returns NULL.
-
PYTHON:
strptime(string, format)
這裡需要注意format,format在文章開頭已經給出
七、轉換圖
這裡給出一張LINUX系統程式設計手冊裡面的一張圖,其實python是一樣的,紅色箭頭是本文涉及的函式
八、方法使用舉例
下面使用C和PYTHON分別實現將日期
2017-10-12 08:52:03(AM) CST
轉換分解時間,日曆時間然後再減去3600秒轉換回分解時間和可讀時間的小程式,以熟悉使用方式
- C程式:
/************************************************************************* > File Name: testtime.c > Author: gaopeng QQ:22389860 all right reserved > Mail: gaopp_200217@163.com > Created Time: Wed 01 Nov 2017 02:28:25 AM CST ************************************************************************/ #include<stdio.h> #include<time.h> #include<stdlib.h> #define MAXSIZE 99 int rtime2ctime(/*in*/const char* r_time,/*out*/time_t* ctime) { time_t i_ctime; struct tm tm_st; //此處根據固定測試轉換為分解時間tm_st if ( !strptime(r_time,"%Y-%m-%d %X(%p) %z",&tm_st)) { return -1; } //此處將分解時間tm_st轉換為日曆時間ctime if( (*ctime = mktime(&tm_st)) == -1) { return -1; } return 0; } int ctime2rtime(/*in*/time_t c_time) { struct tm* tm_st = NULL; char time[MAXSIZE] ; //此處將日曆時間轉換為分解時間 if((tm_st = localtime(&c_time)) == NULL) { return -1; } //此處將分解時間轉換為可讀時間 if(strftime(time,MAXSIZE-1,"%Y-%m-%d %X(%p) %z",tm_st) == 0) { return -1; } printf("%s\n",time); return 0; } int main(void) { char r_time[100] = "2017-10-12 07:52:03(AM) +0800"; time_t ctime; if( rtime2ctime(r_time,&ctime) == -1 ) { printf("rtime2ctime error\n"); return -1; } printf("2017-10-12 07:52:03(AM) +0800 to calenlar time is:%ld\n",ctime); ctime = ctime - (time_t)3600; printf("after sub 1 hours time is:"); if(ctime2rtime(ctime) == -1) { printf("ctime2rtime error\n"); } }
- python程式:
import time def rtime2ctime(r_time): #此處根據固定測試可讀時間轉換為分解時間 p_time = time.strptime(r_time,"%Y-%m-%d %X(%p) %z") #此處將分解時間tm_st轉換為日曆時間 return time.mktime(p_time) def ctime2rtime(ctime): #此處將日曆時間轉換為分解時間 p_time = time.localtime(ctime) #此處將分解時間轉換為可讀時間 r_time = time.strftime("%Y-%m-%d %X(%p) %z",p_time) return r_time r_time="2017-10-12 06:52:03(AM) +0800" ctime = rtime2ctime(r_time) print("2017-10-12 06:52:03(AM) +0800 to calenlar time is:%d" %(ctime)) ctime = ctime - 3600 print("after sub 1 hours time is:%s" %(ctime2rtime(ctime)))
他們的執行結果均是:
2017-10-12 06:52:03(AM) +0800 to calenlar time is:1507762323 after sub 1 hours time is:2017-10-12 05:52:03(AM) +0800
作者微信:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2145919/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux程式設計(獲取系統時間)Linux程式設計
- Linux系統時間與RTC設定Linux
- linux系統時間程式設計(9) 計算程式片段執行時間clock函式Linux程式設計函式
- linux系統時間程式設計(8) UTC秒數轉本地字串時間Linux程式設計字串
- Linux核心模組程式設計--系統呼叫(轉)Linux程式設計
- Linux系統命令與Solaris系統命令的對比Linux
- linux系統程式設計之檔案與IO(七):時間函式小結Linux程式設計函式
- Java和Python的程式設計對比JavaPython程式設計
- linux系統時間設定Linux
- Linux設定系統時間Linux
- linux下的系統時間、硬體時間設定Linux
- linux系統時間程式設計(6) 日曆時間tm轉字串strftime函式Linux程式設計字串函式
- Linux下關於時間概念的C語言程式設計LinuxC語言程式設計
- IM系統中聊天記錄模組的設計與實現
- Linux核心模組程式設計/proc 檔案系統(轉)Linux程式設計
- Linux shell程式設計區分時間段 case+if+比較Linux程式設計
- linux系統程式設計之程式(一):程式與程式Linux程式設計
- Linux時間設定系統時間、硬體時間和時間服務Linux
- Objective-C 2.0 執行時系統程式設計Object程式設計
- 《程式設計時間簡史系列》JavaScript 模組化的歷史程式程式設計JavaScript
- ERP系統中的稽核模組設計(轉)
- 直播系統程式碼,linux date修改系統時間Linux
- 時間系統、程式的排程與切換
- 【Python】Python 使用http時間同步設定系統時間原始碼PythonHTTP原始碼
- Linux系統程式設計(28)——執行緒間同步Linux程式設計執行緒
- (Python程式設計 | 系統程式設計 | 並行系統工具 | 程式退出)Python程式設計並行
- linux系統程式設計之訊號(一):中斷與訊號Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(一)Linux程式設計
- Linux系統程式設計(11)——程式間通訊之有名管道Linux程式設計
- Linux與其他系統對比,具有哪些特點?Linux
- 分散式檔案系統(HDFS)與 linux系統檔案系統 對比分散式Linux
- Python程式設計時候,匯入模組失敗Python程式設計
- ubuntu與centos系統對比UbuntuCentOS
- 對比ubuntu與centos系統 UbuntuCentOS
- C++日期和時間程式設計總結C++程式設計
- Linux 系統時間和硬體時間Linux
- Linux系統程式設計之程式間通訊方式:命名管道(二)Linux程式設計