總結(jié)幾個(gè)我們?cè)诔绦蛑谐S玫降年P(guān)于datetime的操作,以供參考炼绘。
一嗅战、naive類型和aware類型的相互轉(zhuǎn)換。
即不帶時(shí)區(qū)(naive)的時(shí)間日期類型和帶時(shí)區(qū)(naive)的時(shí)間日期類型間的相互轉(zhuǎn)換
1.不帶時(shí)區(qū)的轉(zhuǎn)化為帶時(shí)區(qū)的:
>>> from datetime import datetime
>>> import pytz
>>> china_tz = pytz.timezone('Asia/Shanghai')
>>> local_naive = datetime.now()
>>> local_aware = now_naive.replace(tzinfo=china_tz)
>>> local_aware
datetime.datetime(2016, 12, 18, 8, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8>
2.帶時(shí)區(qū)的類型轉(zhuǎn)化為不帶時(shí)區(qū)的類型:
>>> local_naive = now_aware.replace(tzinfo=None)
>>> local_naive
datetime.datetime(2016, 12, 18, 8, 0, 0)
3.帶時(shí)區(qū)之間的相互轉(zhuǎn)化:
>>> utc_tz = pytz.utc
>>> utc_aware = local_aware.astimezone(utc_tz)
>>> utc_aware
datetime.datetime(2016, 12, 18, 0, 0, <UTC>)
這里要注意datetime.astimezone(tz)和datetime.repalce(tzinfo=tz)的不同:前者生成的新對(duì)象和原對(duì)象還表示同一個(gè)時(shí)間點(diǎn),只不過(guò)時(shí)間數(shù)值大小都轉(zhuǎn)化為新時(shí)區(qū)的了驮捍。后者僅改變時(shí)區(qū)屬性疟呐,時(shí)間數(shù)值大小都不必變,因此很可能表示的不是同一個(gè)時(shí)間點(diǎn)了东且,除非新老時(shí)區(qū)相同启具。
>>> utc_aware - local_aware
datetime.datetime(0)
>>> another_aware = local_aware.replace(tzinfo=utc_tz)
>>> another_aware - local_aware
datetime.timedelta(0, 29160)
二、timestamp和datetime對(duì)象之間的相互轉(zhuǎn)化
1.timestamp轉(zhuǎn)化為datetime
>>> import time
>>> stamp = time.time()
>>> local_time = datetime.fromtimestamp(stamp) # 還可傳入一個(gè)可選參數(shù)tz
>>> local_time
datetime.datetime(2016, 12, 18, 10, 57, 1, 326000)
2.datetime轉(zhuǎn)化為timestamp
>>> import time
>>> struct_time = local_time.timetuple() # 先轉(zhuǎn)化為一個(gè)time.stuct_time對(duì)象
>>> new_stamp = time.mktime(struct_time) # 再轉(zhuǎn)化為timestamp
>>> new_stamp == stamp
False
>>> new_stamp
1482031898.0
>>> stamp
1482031898.039 # 可以看出轉(zhuǎn)化過(guò)來(lái)后有秒以下的精度損失珊泳。
如果你知道絕對(duì)精確轉(zhuǎn)換的方法鲁冯, 請(qǐng)告訴我:)
三、datetime和str之間的轉(zhuǎn)化
1.datetime生成成易于閱讀的字符串(str)
>>> local_time.strftime('%Y-%m-%d') # convert datetime to formate str
2016-12-18
2.從字符串(str)生成datime對(duì)象
>>> date_str = '2016-12-18'
>>> new_datetime = datetime.strptime(date_str, '%Y-%m-%d') # string parsed to datime according to format
>>> new_datetime
datetime.datetime(2016, 12, 18色查, 0薯演, 0)
更多格式可參考下表:python時(shí)間字符串格式表
關(guān)于datetime模塊的更多知識(shí)可參考我的另外一篇文章Python中的datetime模塊的使用