1、datetime是date与time的结合体,包括date和time的所有信息
2、datetime模块定义了两个常量:datetime.MINYEAR和datetime.MAXYEAR,分别表示datetime所能表示的最 小、最大年份。其中,MINYEAR = 1,MAXYEAR = 9999。
一. datetime模块定义了下面这几个类:
1、datetime.date:表示日期的类。常用的属性有year, month, day
2、datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
3、datetime.datetime:表示日期时间。
4、datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
5、datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)
注 :datetime.datetime类的应用最为普遍且上面这些类型的对象都是不可变(immutable)的。
二. datetime.datetime 类中的方法:
1. today()
today()方法的语法如下:
datetime.datetime.today()
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类
2、返回值:返回一个表示当前本地时间的 datetime 对象(即可以将返回值赋值给一个变量)
>>> import datetime
>>>
>>> datetime.datetime.today()
datetime.datetime(2018, 9, 10, 19, 30, 49, 619604)
2. now([ tz ])
语法如下:
datetime.datetime.now([ tz ])
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类
2、如果提供参数 tz,就获取 tz 参数所指时区的本地时间(now是本地时间,可以认为是你电脑现在的时间)
3、返回值:返回当前指定的本地时间
>>> import datetime
>>>
>>> datetime.datetime.now()
datetime.datetime(2018, 9, 10, 19, 36, 42, 98379)
>>>
>>>
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2018, 9, 10, 19, 36, 54, 963209)
3. datetime.utcnow()
语法如下:
datetime.datetime.utcnow()
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类
2、返回值:返回 utc 时间的 datetime 对象。
>>> import datetime
>>>
>>> datetime.datetime.utcnow()
datetime.datetime(2018, 9, 10, 11, 46, 49, 137510)
>>>
>>> datetime.datetime.now()
datetime.datetime(2018, 9, 10, 19, 46, 56, 698172)
4. fromtimestamp( timestamp [, tz])
语法如下:
datetime.datetime.fromtimestamp(timestamp[,tz])
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类
2、参数 tz 表示指定的时区信息,参数 timestamp 表示需要转换的时间戳
3、返回值:返回一个datetime 对象,将一个时间戳形式的时间转换为可读形式
>>> import time, datetime
>>>
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2018, 9, 10, 19, 52, 57, 920758)
>>>
5. utcfromtimestamp( timestamp)
根据时间戳创建一个 datetime 对象。
语法如下:
datetime.datetime.fromtimestamp(timestamp[,tz])
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类, timestamp 指时间戳。
2、返回值:返回一个 datetime 对象。
>>> import time, datetime
>>>
>>> datetime.datetime.utcfromtimestamp(time.time())
datetime.datetime(2018, 9, 10, 11, 58, 52, 88371)
>>>
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2018, 9, 10, 19, 58, 56, 832201)
6. strptime( data_string, format)
str 转换为 datetime
将格式化字符串转换为 datetime 对象
strptime() 方法的语法如下:
datetime.datetime.strptime(date_string,format)
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类
2、参数 date_string 指日期字符串,format 为格式方式
3、返回值:返回一个 datetime 对象
>>> import datetime
>>>
>>> dt = datetime.datetime.now()
>>>
>>> dt.strptime( str(dt),'%Y-%m-%d %H:%M:%S.%f')
datetime.datetime(2018, 9, 10, 20, 21, 53, 663043)
>>>
>>> datetime.datetime.strptime( str(dt),'%Y-%m-%d %H:%M:%S.%f')
datetime.datetime(2018, 9, 10, 20, 21, 53, 663043)
7. strftime(format)
datetime 转换为 str
strftime()方法的语法如下:
datetime.datetime.strftime( format )
1、此语法中 datetime.datetime 指的是 datetime 模块中的 datetime 类
2、参数 format 为格式化方式
3、返回值:返回一个 datetime 对象
>>> import datetime
>>>
>>> now = datetime.datetime.now()
>>>
>>> now.strftime('%Y-%m-%d %H:%M:%S')
'2018-09-10 21:05:51'
三. datetime加减
对日期和时间进行加减实际上就是把 datetime 往后或往前计算,得到新的 datetime。加减可以直接用 +
和 -
运算符,不过需要导入 timedelta
这个类
>>> from datetime import datetime , timedelta
>>>
>>> now = datetime.now()
>>>
>>> now
datetime.datetime(2018, 9, 10, 21, 16, 46, 400495)
>>>
>>>
>>> now + timedelta(hours = 10)
datetime.datetime(2018, 9, 11, 7, 16, 46, 400495)
>>>
>>>
>>> now - timedelta( days = 1)
datetime.datetime(2018, 9, 9, 21, 16, 46, 400495)
>>>
>>> now + timedelta(days = 2,hours = 12)
datetime.datetime(2018, 9, 13, 9, 16, 46, 400495)
>>>
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
四. 本地时间转换为 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(2018, 9, 10, 22, 4, 23, 124651)
>>>
>>> dt = now.replace(tzinfo = tz_utc_8) # 强制设置为UTC+8:00
>>>
>>> dt
datetime.datetime(2018, 9, 10, 22, 4, 23, 124651, tzinfo=datetime.timezone(datetime.timedelta(seconds=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
的转换。