文章内容
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 时区计算时差
评论列表