文章内容
2020/7/21 17:36:57,作 者: 黄兵
python 时区计算时差
最近在美国服务器上,需要计算时间差,使用的是datetime,具体代码如下:
from datetime import datetime
@staticmethod
def time_different(r_id):
get_sms_receive_only_one = SMSReceive.query.filter_by(r_id=r_id).order_by(
Receive.Time.desc()).first_or_404()
# return type datetime
get_time = get_sms_receive_only_one.SMS_ReceiveTime
start = datetime.now()
time_diff_result = (start - get_time).seconds
if time_diff_result <= 60:
# 1分钟之内
result = time_diff_result
unit = 'seconds'
return {'result': result, 'unit': unit}
elif 3600 > time_diff_result > 60:
result = math.floor(time_diff_result / 60)
unit = 'minutes'
return {'result': result, 'unit': unit}
# 1 hour
elif time_diff_result >= 3600:
# 向下取整,获得整小时数,2.5h=2h
result = math.floor(time_diff_result / 3600)
unit = 'hours'
return {'result': result, 'unit': unit}但是这样存在一个问题:
如果服务器上的时区与数据库里面的时区不同,计算结果就会有问题,所以需要转换时区。
下面是我写的一个测试:
def time_diff():
south_africa = timezone('Etc/UTC')
sa_time = datetime.now(south_africa)
print(sa_time.strftime('%Y-%m-%d_%H-%M-%S'))
time_data = '2020-07-21 07:59:19'
time_data_1 = datetime.strptime(time_data, '%Y-%m-%d %H:%M:%S')
time_different = (sa_time - time_data_1).seconds
return jsonify({'result': time_different})这里首先设置了标准utc时区,之后与指定时间(utc时间)对比,但是结果报如下错误:
TypeError: can't subtract offset-naive and offset-aware datetimes
偏移时间不能与真时间运算。
之后参考这篇文章:Can't subtract offset-naive and offset-aware datetimes
修改代码如下:
from datetime import datetime
from pytz import timezone
def time_diff():
south_africa = timezone('Etc/UTC')
sa_time = datetime.now(south_africa)
time_data = '2020-07-21 07:59:19'
time_data_1 = datetime.strptime(time_data, '%Y-%m-%d %H:%M:%S')
time_different = (sa_time.replace(tzinfo=None) - time_data_1).seconds
return jsonify({'result': time_different})解决了这个问题。
同时也可以用这种写法:
from datetime import datetime
import pytz
def time_diff():
local_dt = pytz.utc.localize(datetime.utcnow())
time_data = '2020-07-21 07:59:19'
time_data_1 = datetime.strptime(time_data, '%Y-%m-%d %H:%M:%S')
time_different = (local_dt.replace(tzinfo=None) - time_data_1).seconds
return jsonify({'result': time_different})都是差不多,主要是设置tzinfo=None,之后计算结果,同时要注意:两个时间必须都是同一个时区。
参考资料:
1、Can't subtract offset-naive and offset-aware datetimes
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - python 时区计算时差
评论列表