總結幾個我們在程序中常用到的關于datetime的操作,以供參考。
一、naive類型和aware類型的相互轉換。
即不帶時區(naive)的時間日期類型和帶時區(naive)的時間日期類型間的相互轉換
1.不帶時區的轉化為帶時區的:
>>> 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.帶時區的類型轉化為不帶時區的類型:
>>> local_naive = now_aware.replace(tzinfo=None)
>>> local_naive
datetime.datetime(2016, 12, 18, 8, 0, 0)
3.帶時區之間的相互轉化:
>>> 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)的不同:前者生成的新對象和原對象還表示同一個時間點,只不過時間數值大小都轉化為新時區的了。后者僅改變時區屬性,時間數值大小都不必變,因此很可能表示的不是同一個時間點了,除非新老時區相同。
>>> 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對象之間的相互轉化
1.timestamp轉化為datetime
>>> import time
>>> stamp = time.time()
>>> local_time = datetime.fromtimestamp(stamp) # 還可傳入一個可選參數tz
>>> local_time
datetime.datetime(2016, 12, 18, 10, 57, 1, 326000)
2.datetime轉化為timestamp
>>> import time
>>> struct_time = local_time.timetuple() # 先轉化為一個time.stuct_time對象
>>> new_stamp = time.mktime(struct_time) # 再轉化為timestamp
>>> new_stamp == stamp
False
>>> new_stamp
1482031898.0
>>> stamp
1482031898.039 # 可以看出轉化過來后有秒以下的精度損失。
如果你知道絕對精確轉換的方法, 請告訴我:)
三、datetime和str之間的轉化
1.datetime生成成易于閱讀的字符串(str)
>>> local_time.strftime('%Y-%m-%d') # convert datetime to formate str
2016-12-18
2.從字符串(str)生成datime對象
>>> 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時間字符串格式表
關于datetime模塊的更多知識可參考我的另外一篇文章Python中的datetime模塊的使用