Python -- datetime模块

datetime是Python处理日期和时间的标准库

获取当前日期和时间

获取指定日期和时间

 1 from datetime import datetime, timedelta, timezone
 2 
 3 # 获取当前datetime:
 4 now = datetime.now()
 5 print('now =', now)
 6 print('type(now) =', type(now))
 7 
 8 # 用指定日期时间创建datetime:
 9 dt = datetime(2015, 4, 19, 12, 20)
10 print('dt =', dt)

datetime与timestamp转换

    timestamp的值与时区没有关系,因为timestamp一旦确定了,其UTC时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以timestamp表示的。

注:1、python的timestamp是一个浮点数,如果有小数位,小数位表示毫秒数

某些编程语言(如JAVA和JavaScript)的timestamp使用整数表示毫秒数,此时把timestamp除以1000就得到python的浮点表示方法

2、timestamp是一个浮点数,没有时区的概念,而datetime是有时区的

把datetime转换为timestamp调用timestamp( )方法

把timestamp转换为datetime,调用datetime的fromtimestamp( )方法,如果转换成带时区信息,即UTC+8这种形式,调用调用datetime的utcfromtimestamp( )方法

 1 from datetime import datetime, timedelta, timezone
 2 
 3 # 用指定日期时间创建datetime:
 4 dt = datetime(2015, 4, 19, 12, 20)
 5 print('dt =', dt)
 6 
 7 # 把datetime转换为timestamp:
 8 print('datetime -> timestamp:', dt.timestamp())
 9 
10 # 把timestamp转换为datetime:
11 t = dt.timestamp()
12 print('timestamp -> datetime:', datetime.fromtimestamp(t))  #本地时间
13 print('timestamp -> datetime as UTC+0:', datetime.utcfromtimestamp(t))   #UTC时间

 datetime与str转换

当用户输入的日期和时间是字符串时,要处理日期和时间,必须先把str转换为datetime,方法:datetime.strptime( )实现

注意:转换后的datetime是没有时区信息的,即后面不带UTC+8这种形式

把datetime对象,格式化为字符串给用户,方法:strftime( )

1 from datetime import datetime, timedelta, timezone
2 
3 # 从str读取datetime:
4 cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
5 print('strptime:', cday)
6 
7 # 把datetime格式化输出:
8 print('strftime:', cday.strftime('%a, %b %d %H:%M'))

datetime加减

即计算某个时间点一段时间间隔后的时间

方法:timedelta这个类,timedelta(days=3) , timedelta(hours=10), timedelta(days=1, hours=8)

1 # 对日期进行加减:
2 print('current datetime =', cday)
3 print('current + 10 hours =', cday + timedelta(hours=10))
4 print('current - 1 day =', cday - timedelta(days=1))
5 print('current + 2.5 days =', cday + timedelta(days=2, hours=12))

 本地时间转换为UTC时间

本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间是指UTC+0:00时区的时间

datetime类型有一个时区属性tzinfo,但默认是None,所以无法区分这个datetime到底是哪个时区,除非给datetime设置一个时区UTC形式

 1 from datetime import datetime, timedelta, timezone
 2 
 3 tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
 4 
 5 now = datetime.now()  #当前时间,不带UTC形式
 6 
 7 dt = datetime.now().replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00,带UTC形式
 8 dt1 = datetime.now().replace(tzinfo=timezone(timedelta(hours=8)))
 9 
10 print("当前时间,不带UTC,不能确定是哪个时区:",now)
11 print("当前时间,带UTC,可以确定是哪个时区的时间:",dt)
12 print("当前时间,带UTC,可以直接写tzinfo:",dt1)

划红线的说明转换为UTC形式的时间了

时区转换

utcnow( )可以获得UTC+0:00时区的时间,再转换为任意时区的时间:

利用带时区的datetime,通过astimezone( )方法,可以转换到任意时区

注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime都可以正确转换,例如bj_dt到tokyp_dt的转换,依然是hours=9,而不是hours=1

 1 # 把时间从UTC+0时区转换为UTC+8:
 2 utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
 3 
 4 bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
 5 
 6 tokoy_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
 7 
 8 tokoy1_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
 9 
10 print('UTC+0:00 now =', utc_dt)
11 print('UTC+8:00 now =', bj_dt)
12 print('UTC+9:00 now =', tokoy_dt)
13 print('从UTC+8:00转换为UTC+9:00 now =', tokoy1_dt)

实战

题目:假设你获取了用户输入的日期和时间,如2015-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:

 1 from datetime import datetime, timezone, timedelta
 2 
 3 def to_timestamp(dt_str, tz_str):
 4     dt=datetime.strptime(dt_str,'%Y-%m-%d %H:%M:%S')
 5     tz=int(tz_str[3:-3])  #获取+,包含+以及冒号之前的部分,这是 自己最初的想法
 6     # tz=int(tz_str[3:].split(":")[0])   #第二种tz的计算方法,这是参考别人获得
 7     dt1=dt.replace(tzinfo=timezone(timedelta(hours=tz)))
 8     t=dt1.timestamp()
 9     return t
10 
11 t1 = to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
12 assert t1 == 1433121030.0, t1
13 
14 t2 = to_timestamp('2015-5-31 16:10:30', 'UTC-09:00')
15 assert t2 == 1433121030.0, t2
16 
17 print('ok')

猜你喜欢

转载自www.cnblogs.com/bravesunforever/p/10662883.html
今日推荐