总结几个我们在程序中常用到的关于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??榈母嘀犊刹慰嘉业牧硗庖黄恼?a href="http://08643.cn/p/1957c4cab0a3" target="_blank">Python中的datetime模块的使用