1. 程式人生 > >日期時間--import--time-date--datetime--calendar

日期時間--import--time-date--datetime--calendar

re

--********************************************************************************************************************************

--import------import time 模塊------Python 日期和時間----------------calendar,time,date,datetime-----------------------------

--********************************************************************************************************************************

Python程序能用很多方式處理日期和時間,轉換日期格式是一個常見的功能。

時間間隔是以秒為單位的浮點小數。

每個時間戳都以自從1970年1月1日午夜(歷元)經過了多長時間來表示。

一般有2種表示時間的方式: 第1種 以時間戳的方式(相對於1970.1.1 00:00:00以秒計算的偏移量),時間戳是惟一的

第2種 以數組的形式表示即(struct_time),共有九個元素,分別表示,同一個時間戳的struct_time會因為時區不同而不同

----------------Time 模塊--包含了以下內置函數,時間處理+轉換時間格式----它提供的接口與C標準庫time.h基本一致

time.altzone 返回格林威治西部的夏令時地區的偏移秒數。如果該地區在格林威治東部會返回負值(如西歐,包括英國)。對夏令時啟用地區才能使用。

time.asctime([tupletime]) 接受時間元組並返回一個可讀的形式為"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18時07分14秒)的24個字符的字符串。

asctime([tuple]) -> string 將一個struct_time(默認為當時時間),轉換成字符串

time.clock( ) 用以浮點數計算的秒數返回當前的CPU時間。用來衡量不同程序的耗時,比time.time()更有用。

該函數有兩個功能: 在第1次調用的時候,返回的是程序運行的實際時間; 以第2次之後的調用,返回的是自第一次調用後,到這次調用的時間間隔

time.gmtime([secs]) 接收時間輟(1970紀元後經過的浮點秒數)並返回格林威治天文時間下的時間元組t。註: t.tm_isdst始終為0

將一個時間戳轉換成一個UTC時區(0時區)的struct_time,如果seconds參數未輸入,則以當前時間為轉換標準

gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,tm_sec, tm_wday, tm_yday, tm_isdst)

time.mktime(tupletime) 接受時間元組並返回時間輟(1970紀元後經過的浮點秒數) 將格式字符串轉換為時間戳

mktime(tuple) -> floating point number 將一個以struct_time轉換為時間戳

time.mktime(time.strptime("Sat Mar 28 22:24:24 2009","%a %b %d %H:%M:%S %Y"))

time.sleep(secondss) 推遲調用線程的運行,secs指秒數。

線程推遲指定的時間運行,經過測試,單位為秒,但是在幫助文檔中有以下這樣一句話,這關是看不懂

time.strftime(format[,tupletime]) 格式化日期 接收以時間元組,並返回以可讀字符串表示的當地時間,格式由fmt決定。

strftime(format[, tuple]) -> string 將指定的struct_time(默認為當前時間),根據指定的格式化字符串輸出

time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') 根據fmt的格式把一個時間字符串解析為時間元組。

strptime(string, format) -> struct_time 將時間字符串根據指定的格式化符轉換成數組形式的時間

print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 格式化成 2016-03-20 11:45:39形式

print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) # 格式化成 Sat Mar 28 22:24:24 2016形式

time.time( ) 獲取當前時間的時間戳(1970紀元後經過的浮點秒數)。

time.localtime([secs]) 獲取當前時間的struct_time形式 接收時間輟(1970紀元後經過的浮點秒數)並返回當地時間下的時間元組t(t.tm_isdst可取0或1,取決於當地當時是不是夏令時)。

localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst) 將一個時間戳轉換成一個當前時區的struct_time,如果seconds參數未輸入,則以當前時間為轉換標準

time.ctime([secs]) 獲取當前時間的字符串形式 作用相當於asctime(localtime(secs)),未給參數相當於asctime()

ctime(seconds) -> string 將一個時間戳(默認為當前時間)轉換成一個時間字符串

time.ctime() 輸出為: 'Sat Mar 28 22:24:24 2009'

time.tzset() 根據環境變量TZ重新初始化時間相關設置。

time類的構造函數 class datetime.time(hour[, minute[, second[, microsecond[, tzinfo]]]]) : 各參數的意義不作解釋,這裏留意一下參數tzinfo,它表示時區信息。

註意一下各參數的取值範圍: hour的範圍為[0, 24),minute的範圍為[0, 60),second的範圍為[0, 60),microsecond的範圍為[0, 1000000)。

time類定義的類屬性:

time.min time類所能表示的最小時間 time.min = time(0, 0, 0, 0)

time.max time類所能表示的最大時間 time.max = time(23, 59, 59, 999999)

?time.resolution: 時間的最小單位,這裏是1微秒;

time類提供的實例方法和屬性:

?time.hour

time.minute

time.second

time.microsecond: 時、分、秒、微秒;

?time.tzinfo: 時區信息;

?time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]): 創建一個新的時間對象,用參數指定的時、分、秒、微秒代替原有對象中的屬性(原有對象仍保持不變);

?time.isoformat(): 返回型如"HH:MM:SS"格式的字符串表示;

Time模塊包含了以下2個非常重要的屬性:

time.timezone 屬性time.timezone是當地時區(未啟動夏令時)距離格林威治的偏移秒數(>0,美洲;<=0大部分歐洲,亞洲,非洲)。

time.tzname 屬性time.tzname包含一對根據情況的不同而不同的字符串,分別是帶夏令時的本地時區名稱,和不帶的。

---------------Calendar 模塊--都是日歷相關的,例如打印某月的字符月歷---模塊包含了以下內置函數

星期一是默認的每周第一天,星期天是默認的最後一天。更改設置需調用calendar.setfirstweekday()函數

calendar.calendar(year,w=2,l=1,c=6) 返回一個多行字符串格式的year年年歷,3個月一行,間隔距離為c。 每日寬度間隔為w字符。每行長度為21* W+18+2* C。l是每星期行數。

calendar.firstweekday( ) 返回當前每周起始日期的設置。默認情況下,首次載入caendar模塊時返回0,即星期一。

calendar.isleap(year) 是閏年返回True,否則為false。

calendar.leapdays(y1,y2) 返回在Y1,Y2兩年之間的閏年總數。

calendar.month(year,month,w=2,l=1) 返回一個多行字符串格式的year年month月日歷,兩行標題,一周一行。每日寬度間隔為w字符。每行的長度為7* w+6。l是每星期的行數。

calendar.monthcalendar(year,month) 返回一個整數的單層嵌套列表。每個子列表裝載代表一個星期的整數。Year年month月外的日期都設為0;範圍內的日子都由該月第幾日表示,從1開始。

calendar.monthrange(year,month) 返回兩個整數。第一個是該月的星期幾的日期碼,第二個是該月的日期碼。日從0(星期一)到6(星期日);月從1到12。

calendar.prcal(year,w=2,l=1,c=6) 相當於 print calendar.calendar(year,w,l,c).

calendar.prmonth(year,month,w=2,l=1) 相當於 print calendar.calendar(year,w,l,c)。

calendar.setfirstweekday(weekday) 設置每周的起始日期碼。0(星期一)到6(星期日)。

calendar.timegm(tupletime) 和time.gmtime相反: 接受一個時間元組形式,返回該時刻的時間輟(1970紀元後經過的浮點秒數)。

calendar.weekday(year,month,day) 返回給定日期的日期碼。0(星期一)到6(星期日)。月份為 1(一月) 到 12(12月)。

----------------datetime 模塊--是date與time的結合體,包括date與time的所有信息----相比於time模塊,datetime模塊的接口則更直觀、更容易調用

datetime模塊定義了兩個常量:

datetime.MINYEAR 表示datetime所能表示的最小年份 MINYEAR = 1

datetime.MAXYEAR 表示datetime所能表示的最大年份 MAXYEAR = 9999 (對於偶等玩家,這個範圍已經足夠用矣~~)

構造函數: datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]),各參數的含義與date、time的構造函數中的一樣,要註意參數值的範圍。

year (four digits, e.g. 1998)

month (1-12) day (1-31) hours (0-23) minutes (0-59) seconds (0-59) weekday (0-6, Monday is 0)

Julian day (day in the year, 1-366)

DST (Daylight Savings Time) flag (-1, 0 or 1) 是否是夏令時

datetime.datetime: 表示日期時間。

datetime.date(): 獲取date對象 表示日期的類。常用的屬性有year, month, day;

datetime.time(): 獲取time對象 表示時間的類。常用的屬性有hour, minute, second, microsecond;

datetime.timedelta: 表示時間間隔,即兩個時間點之間的長度。

datetime.tzinfo: 與時區有關的相關信息。(這裏不詳細充分討論該類,感興趣的童鞋可以參考python手冊)

註: 上面這些類型的對象都是不可變(immutable)的。

?datetime.min、datetime.max: datetime所能表示的最小值與最大值;

?datetime.resolution: datetime最小單位; date對象表示日期的最小單位。這裏是天。

?datetime.today(): 返回一個表示當前本地時間的datetime對象; 返回一個表示當前本地日期的date對象;

?datetime.now([tz]): 返回一個表示當前本地時間的datetime對象,如果提供了參數tz,則獲取tz參數所指時區的本地時間;

?datetime.utcnow(): 返回一個當前utc時間的datetime對象;

?datetime.fromtimestamp(timestamp[, tz]): 根據給定的時間戮創建一個datetime對象,參數tz指定時區信息

?datetime.utcfromtimestamp(timestamp): 根據時間戮創建一個datetime對象;

?datetime.combine(date, time): 根據date和time,創建一個datetime對象;

?datetime.strptime(date_string, format): 將格式字符串轉換為datetime對象;

?datetime.fromordinal(ordinal): 將Gregorian日歷時間轉換為date對象;(Gregorian Calendar: 一種日歷表示方法,類似於我國的農歷,西方國家使用比較多,此處不詳細展開討論。)

datetime類提供的實例方法與屬性(很多屬性或方法在date和time中已經出現過,在此有類似的意義,這裏只羅列這些方法名,具體含義不再逐個展開介紹,可以參考上文對date與time類的講解。):

?datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]):

?datetime.utctimetuple()

?datetime.ctime(): 返回一個日期時間的C格式字符串,等效於time.ctime(time.mktime(dt.timetuple()));

--date類----表示一個日期。日期由年、月、日組成-

構造函數: class datetime.date(year, month, day): 參數的意義就不多作解釋了,只是有幾點要註意一下:

?year的範圍是[MINYEAR, MAXYEAR],即[1, 9999];

?month的範圍是[1, 12]。(月份是從1開始的,不是從0開始的~_~);

?day的最大值根據給定的year, month參數來決定。例如閏年2月份有29天;

date.max date對象所能表示的最大日期

date.min date對象所能表示的最小日期

?date.year 年

date.month 月

date.day 日

?date.replace(year, month, day): 生成一個新的日期對象,用參數指定的年,月,日代替原有對象中的屬性。(原有對象仍保持不變)

?date.timetuple(): 返回日期對應的time.struct_time對象;

?date.toordinal(): 返回日期對應的Gregorian Calendar日期;

?date.weekday(): 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此類推;

?data.isoweekday(): 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此類推;

?date.isocalendar(): 返回格式如(year,month,day)的元組;

?date.isoformat([sep]): 返回格式如'YYYY-MM-DD'的字符串;

?date.strftime(format): 自定義格式化字符串。在下面詳細講解。

date還對某些操作進行了重載,它允許我們對日期進行如下一些操作:

?date2 = date1 + timedelta # 日期加上一個間隔,返回一個新的日期對象(timedelta將在下面介紹,表示時間間隔)

?date2 = date1 - timedelta # 日期隔去間隔,返回一個新的日期對象

?timedelta = date1 - date2 # 兩個日期相減,返回一個時間間隔對象

?date1 < date2 # 兩個日期進行比較

----------------pytz 模塊--

----------------dateutil 模塊--

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import time

localtime = time.localtime(time.time()) --獲取當前時間 從返回浮點數的時間輟方式向時間元組轉換,只要將浮點數傳遞給如localtime之類的函數

print "本地時間為 :", localtime 輸出結果 本地時間為 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)


localtime = time.asctime( time.localtime(time.time()) )

print "本地時間為 :", localtime --獲取格式化的時間 輸出結果 本地時間為 : Thu Apr 7 10:05:21 2016 你可以根據需求選取各種格式,但是最簡單的獲取可讀的時間模式的函數


a = "Sat Mar 28 22:24:24 2016"

print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")) # 將格式字符串轉換為時間戳 1459175064.0

import time

if __name__ == '__main__':

time.sleep(1)

print "clock1:%s" % time.clock()

time.sleep(1)

print "clock2:%s" % time.clock()

time.sleep(1)

print "clock3:%s" % time.clock()

輸出:

clock1:3.35238137808e-006

clock2:1.00004944763

clock3:2.00012040636

其中第一個clock輸出的是程序運行時間

第二、三個clock輸出的都是與第一個clock的時間間隔



Python 的 time 模塊下有很多函數可以轉換常見日期格式。如函數time.time()用於獲取當前時間戳, 如下實例:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import time; # 引入time模塊

ticks = time.time()

print "當前時間戳為:", ticks

以上實例輸出結果:

當前時間戳為: 1459994552.51

時間戳單位最適於做日期運算。但是1970年之前的日期就無法以此表示了。太遙遠的日期也不行,UNIX和Windows只支持到2038年。

--什麽是時間元組?

很多Python函數用一個元組裝起來的9組數字處理時間:

序號 字段

0 4位數年 2008

1 1 到 12

2 1到31

3 小時 0到23

4 分鐘 0到59

5 0到61 (60或61 是閏秒)

6 一周的第幾日 0到6 (0是周一)

7 一年的第幾日 1到366 (儒略歷)

8 夏令時 -1, 0, 1, -1是決定是否為夏令時的旗幟

上述也就是struct_time元組。這種結構具有如下屬性:

序號 屬性

0 tm_year 2008

1 tm_mon 1 到 12

2 tm_mday 1 到 31

3 tm_hour 0 到 23

4 tm_min 0 到 59

5 tm_sec 0 到 61 (60或61 是閏秒)

6 tm_wday 0到6 (0是周一)

7 tm_yday 1 到 366(儒略歷)

8 tm_isdst -1, 0, 1, -1是決定是否為夏令時的旗幟

使用

from datetime import *

import time

print 'date.max:', date.max # date.max: 9999-12-31

print 'date.min:', date.min # date.min: 0001-01-01

print 'date.today():', date.today() # date.today(): 2010-04-06

print 'date.fromtimestamp():', date.fromtimestamp(time.time()) # date.fromtimestamp(): 2010-04-06

now = date(2010, 04, 06)

tomorrow = now.replace(day = 07)

print 'now:', now, ', tomorrow:', tomorrow # now: 2010-04-06 , tomorrow: 2010-04-07

print 'timetuple():', now.timetuple() # timetuple(): (2010, 4, 6, 0, 0, 0, 1, 96, -1)

print 'weekday():', now.weekday() # weekday(): 1

print 'isoweekday():', now.isoweekday() # isoweekday(): 2

print 'isocalendar():', now.isocalendar() # isocalendar(): (2010, 14, 2)

print 'isoformat():', now.isoformat() # isoformat(): 2010-04-06

註: 對日期進行操作時,要防止日期超出它所能表示的範圍。

now = date.today()

tomorrow = now.replace(day = 7)

delta = tomorrow - now

print 'now:', now, ' tomorrow:', tomorrow # now: 2010-04-06 tomorrow: 2010-04-07

print 'timedelta:', delta # timedelta: 1 day, 0:00:00

print now + delta # 2010-04-07

print tomorrow > now # True

from datetime import *

tm = time(23, 46, 10)

print 'tm:', tm # tm: 23:46:10

print 'hour: %d, minute: %d, second: %d, microsecond: %d' / # hour: 23, minute: 46, second: 10, microsecond: 0

% (tm.hour, tm.minute, tm.second, tm.microsecond)

tm1 = tm.replace(hour = 20)

print 'tm1:', tm1 # tm1: 20:46:10

print 'isoformat():', tm.isoformat() # isoformat(): 23:46:10

像date一樣,也可以對兩個time對象進行比較,或者相減返回一個時間間隔對象。這裏就不提供例子了。

print 'datetime.max:', datetime.max # datetime.max: 9999-12-31 23:59:59.999999

print 'datetime.min:', datetime.min # datetime.min: 0001-01-01 00:00:00

print 'datetime.resolution:', datetime.resolution # datetime.resolution: 0:00:00.000001

print 'today():', datetime.today() # today(): 2010-04-07 09:48:16.234000

print 'now():', datetime.now() # now(): 2010-04-07 09:48:16.234000

print 'utcnow():', datetime.utcnow() # utcnow(): 2010-04-07 01:48:16.234000 # 中國位於+8時間,與本地時間相差8

print 'fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time()) # fromtimestamp(tmstmp): 2010-04-07 09:48:16.234000

print 'utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time()) # utcfromtimestamp(tmstmp): 2010-04-07 01:48:16.234000dt = datetime.now()

print '(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f')

print '(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p')

print '%%a: %s ' % dt.strftime('%a')

print '%%A: %s ' % dt.strftime('%A')

print '%%b: %s ' % dt.strftime('%b')

print '%%B: %s ' % dt.strftime('%B')

print '日期時間%%c: %s ' % dt.strftime('%c')

print '日期%%x: %s ' % dt.strftime('%x')

print '時間%%X: %s ' % dt.strftime('%X')

print '今天是這周的第%s天 ' % dt.strftime('%w')

print '今天是今年的第%s天 ' % dt.strftime('%j')

print '今周是今年的第%s周 ' % dt.strftime('%U')


這篇文章主要介紹了Python常用時間操作,包括取得當前時間、時間函數、應用等概念與相關操作技巧,需要的朋友可以參考下

本文實例講述了Python常用時間操作。分享給大家供大家參考,具體如下:

我們先導入必須用到的一個module

>>> import time

設置一個時間的格式,下面會用到

>>>ISOTIMEFORMAT='%Y-%m-%d %X'

看一下當前的時間,和其他很多語言相似這是從epoch(1970 年 1 月 1 日 00:00:00)開始到當前的秒數。

>>> time.time() 1180759620.859

上面的看不懂,換個格式來看看

>>> time.localtime() (2007, 6, 2, 12, 47, 7, 5, 153, 0)

localtime返回tuple格式的時間,有一個和它類似的函數叫gmtime(),2個函數的差別是時區,gmtime()返回的是0時區的值,localtime返回的是當前時區的值。

>>> time.strftime( ISOTIMEFORMAT, time.localtime() )

'2007-06-02 12:54:29′

用上我們的時間格式定義了,使用strftime對時間做一個轉換,如果取現在的時間,time.localtime() 可以不用。

>>> time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) ) '2007-06-02 12:54:31′

>>> time.strftime( ISOTIMEFORMAT, time.gmtime( time.time() ) ) '2007-06-02 04:55:02′

上面展示了gmtime和localtime的區別。

查看時區用

>>> time.timezone

-28800

上面的值是一個秒值,是當前時區和0時區相差的描述,-28800=-8*3600,即為東八區。


def ISOString2Time( s ):

'''

convert a ISO format time to second

from:2006-04-12 16:46:40 to:23123123

把一個時間轉化為秒

'''

return time.strptime( s, ISOTIMEFORMAT )

def Time2ISOString( s ):

'''

convert second to a ISO format time

from: 23123123 to: 2006-04-12 16:46:40

把給定的秒轉化為定義的格式

'''

return time.strftime( ISOTIMEFORMAT, time.localtime( float( s) ) )

def dateplustime( d, t ):

'''

d=2006-04-12 16:46:40

t=2小時

return 2006-04-12 18:46:40

計算一個日期相差多少秒的日期,time2sec是另外一個函數,可以處理,3天,13分鐘,10小時等字符串,回頭再來寫這個,需要結合正則表達式。

'''

return Time2ISOString( time.mktime( ISOString2Time( d ))+time2sec( t ) )

def dateMinDate( d1, d2 ):

'''

minus to iso format date,return seconds

計算2個時間相差多少秒

'''

d1=ISOString2Time( d1 )

d2=ISOString2Time( d2 )

return time.mktime( d1 )-time.mktime( d2 )


三、疑點

1.夏令時

在struct_time中,夏令時好像沒有用,例如

a = (2009, 6, 28, 23, 8, 34, 5, 87, 1)

b = (2009, 6, 28, 23, 8, 34, 5, 87, 0)

a和b分別表示的是夏令時和標準時間,它們之間轉換為時間戳應該相關3600,但是轉換後輸出都為646585714.0

--python中時間日期格式化符號

%y 兩位數的年份表示(00-99) 2個數字表示的年份

%Y 四位數的年份表示(000-9999) 4個數字表示的年份

%m 月份(01-12)

%d 月內中的一天(0-31) 日在這個月中的天數(是這個月的第幾天)

%H 24小時制小時數(0-23)

%I 12小時制小時數(01-12)

%M 分鐘數(00=59)

%S 秒(00-59) 秒(範圍為[00,61],為什麽不是[00, 59],參考python手冊~_~)

%f 微秒(範圍[0,999999])

%H: 小時(24小時制,[0, 23])

%I: 小時(12小時制,[0, 11])

%j: 日在年中的天數 [001,366](是當年的第幾天)

%m: 月份([01,12])

%M: 分鐘([00,59])

%p: AM或者PM 本地A.M.或P.M.的等價符

%a 本地簡化星期名稱 星期的簡寫。如 星期三為Web

%A 本地完整星期名稱 星期的全寫。如 星期三為Wednesday

%b 本地簡化的月份名稱 月份的簡寫。如4月份為Apr

%B 本地完整的月份名稱 月份的全寫。如4月份為April

%c 本地相應的日期表示和時間表示 日期時間的字符串表示。(如: 04/07/10 10:43:39)

%j 年內的一天(001-366)

%U 一年中的星期數(00-53)星期天為星期的開始 周在當年的周數當年的第幾周),星期天作為周的第一天

%w 星期(0-6),星期天為星期的開始 今天在這周的天數,範圍為[0, 6],6表示星期天

%W 一年中的星期數(00-53)星期一為星期的開始 周在當年的周數(是當年的第幾周),星期一作為周的第一天

%x 本地相應的日期表示 日期字符串(如: 04/07/10)

%X 本地相應的時間表示 時間字符串(如: 10:43:39)

%z 與utc時間的間隔 (如果是本地時間,返回空字符串)

%Z 當前時區的名稱 時區名稱(如果是本地時間,返回空字符串)

%% %號本身

# (%Y-%m-%d %H:%M:%S %f): 2010-04-07 10:52:18 937000

# (%Y-%m-%d %H:%M:%S %p): 10-04-07 10:52:18 AM

像date一樣,也可以對兩個datetime對象進行比較,或者相減返回一個時間間隔對象,或者日期時間加上一個間隔返回一個新的日期時間對象。這裏不提供詳細的例子,看客自己動手試一下~~

格式字符串

datetime、date、time都提供了strftime()方法,該方法接收一個格式字符串,輸出日期時間的字符串表示。

日期時間--import--time-date--datetime--calendar