文章内容

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

2、Date and Time Formats

3、datetime --- 基本的日期和时间类型


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - python 时区计算时差

scss用法总结
Ubuntu 更改时区
分享到:

发表评论

评论列表