Python datetime模块详解:从基础用法到时区处理
本文详细介绍Python标准库datetime模块的核心功能,涵盖获取当前时间、构造指定时间、与时间戳(timestamp)的相互转换、字符串与datetime对象的格式互转,以及利用timedelta进行时间加减运算。重点讲解UTC时间与本地时区的转换逻辑,包括tzinfo属性的设置和astimezone()方法的应用,帮助开发者准确处理跨时区的时间数据。
Python datetime模块简介
datetime是Python中用于处理日期和时间的标准库。
获取当前日期和时间
获取当前日期和时间
首先介绍如何获取当前的日期和时间信息。
>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2015-05-18 16:28:07.198690
>>> print(type(now))
<class 'datetime.datetime'>
需要注意的是,datetime指的是整个模块,而datetime模块内部还包含一个名为datetime的类。只有通过from datetime import datetime语句导入后,才能直接使用datetime这个类。
如果仅使用import datetime导入模块,则在调用时必须使用完整名称datetime.datetime。
调用datetime.now()可以返回当前的日期和时间,其返回值的类型为datetime。
构造指定日期和时间
获取指定日期和时间
若要创建特定的日期和时间,可以直接通过参数构造一个datetime对象。
>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
>>> print(dt)
2015-04-19 12:20:00
datetime与timestamp互转
datetime转换为timestamp
在计算机系统中,时间以数字形式存储。我们将1970年1月1日 00:00:00 UTC+00:00时区的时刻定义为epoch time,记为0(1970年之前的时间timestamp为负数)。当前时间即为相对于epoch time的秒数,称为timestamp。
可以理解为:
timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00
对应的北京时间表示为:
timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00
由此可见,timestamp的值与时区无关。因为一旦确定timestamp,其对应的UTC时间也就确定了,转换到任意时区的时间也是完全确定的。这就是计算机以timestamp存储当前时间的原因,因为全球各地校准后的计算机在任意时刻的timestamp都是相同的。
将一个datetime类型转换为timestamp,只需简单调用timestamp()方法。
>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
>>> dt.timestamp() # 把datetime转换为timestamp
1429417200.0
注意Python中的timestamp是一个浮点数。若存在小数位,则表示毫秒数。
某些编程语言(如Java和JavaScript)使用整数表示毫秒数,此时只需将timestamp除以1000即可得到Python的浮点表示。
timestamp转换为datetime
要将timestamp转换为datetime,可使用datetime提供的fromtimestamp()方法。
>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00
需注意timestamp是浮点数,不含时区信息,而datetime包含时区。上述转换是在timestamp与本地时间之间进行。
本地时间指当前操作系统设定的时区。例如北京时区为东8区,则本地时间为:
2015-04-19 12:20:00
实际上即UTC+8:00时区的时间:
2015-04-19 12:20:00 UTC+8:00
此时格林威治标准时间(UTC+0:00)与北京时间相差8小时,因此UTC+0:00时区的时间应为:
2015-04-19 04:20:00 UTC+0:00
timestamp也可直接转换为UTC标准时区的时间。
>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00
字符串与datetime格式转换
str转换为datetime
用户输入的日期和时间通常为字符串,处理前需先将str转换为datetime。通过指定日期和时间的格式化字符串,利用datetime.strptime()实现转换。
>>> from datetime import datetime
>>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
2015-06-01 18:19:59
字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。详细说明请参考Python文档。
注意转换后的datetime对象不包含时区信息。
datetime转换为str
若已有datetime对象并需格式化为字符串显示,可通过strftime()方法转换为str,同样需要指定日期和时间的格式化字符串。
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
Mon, May 05 16:28
时间加减运算
datetime加减
对日期和时间进行加减即计算新的datetime。可直接使用+和-运算符,但需导入timedelta类。
>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
>>> now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
>>> now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
可见,使用timedelta可轻松计算前几天或后几天的时刻。
本地时间与UTC时区转换
本地时间转换为UTC时间
本地时间指系统设定时区的时间,如北京时间为UTC+8:00,而UTC时间指UTC+0:00时区的时间。
一个datetime类型具有时区属性tzinfo,但默认为None,因此无法区分该datetime所属时区,除非强制设置datetime的时区。
>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
若系统时区恰好为UTC+8:00,则上述代码正确;否则,不能强制设置为UTC+8:00时区。
时区转换
可先通过utcnow()获取当前UTC时间,再转换为任意时区的时间。
# 拿到UTC时间,并强制设置时区为UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2015-05-18 09:05:12.377316+00:00
# astimezone()将转换时区为北京时间:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2015-05-18 17:05:12.377316+08:00
# astimezone()将转换时区为东京时间:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00
# astimezone()将bj_dt转换时区为东京时间:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00
时区转换的关键在于获取datetime时,需知其正确时区,然后强制设置时区作为基准。
利用带时区的datetime,通过astimezone()方法,可转换到任意时区。
注:并非必须从UTC+0:00时区转换到其他时区,任何带时区的datetime均可正确转换,例如上述bj_dt到tokyo_dt的转换。
总结
小结
datetime表示的时间需时区信息才能确定特定时间,否则仅视为本地时间。
若需存储datetime,最佳方法是转换为timestamp再存储,因为timestamp的值与时区完全无关。
以上就是详解python datetime模块的详细内容,更多关于python datetime模块的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









