获取当前日期和时间
获取指定日期和时间
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)
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时间
当用户输入的日期和时间是字符串时,要处理日期和时间,必须先把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‘))
即计算某个时间点一段时间间隔后的时间
方法: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+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‘)
原文:https://www.cnblogs.com/bravesunforever/p/10662883.html