django-区分时区的时间类型

# aware time:清醒的时间(清醒的知道自己这个时间代表的是哪个时区的)
# navie time:幼稚的时间(不知道自己的时间代表的是哪个时区)

在settings.py中设置

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Shanghai'  # need1

USE_I18N = True

USE_L10N = True

USE_TZ = True  # 设置为aware time  ps:清醒的时间,自动区分时区 need2

#### 使用aware time 进行计算操作。出现的错误

can't subtract offset-naive and offset-aware datetimes

因为在django中使用的是aware time,而通过datetime.now()获取当前时间是 navie time类型,

解决办法:使用django提供的获取当前aware time类型的时间
from django.utils.timezone import now
# -*- coding: utf-8 -*-
from datetime import datetime
from django import template
from django.utils.timezone import now

register = template.Library()


@register.filter
def time_since(value):
    """
    time距离现在的时间间隔
    1.如果时间间隔小于1分钟以内,那么就显示“刚刚”
    2.如果是大于1分钟小于1小时,那么就显示“xx分钟前”
    3.如果是大于1小时小于24小时,那么就显示“xx小时前”
    4.如果是大于24小时小于30天以内,那么就显示“xx天前”
    5.否则就是显示具体的时间
    2017/10/20 16:15
    """
    print(value)  # aware time类型
    if not isinstance(value, datetime):
        return value
    # now_time = datetime.now()  # navie time类型
    now_time = now()  # django内置的获取当前aware time类型
    timestamp = (now_time - value).total_seconds()  # 将datatime类型转化成秒
    if timestamp < 60:
        return '刚刚'
    elif timestamp <= 60 * 60:
        return "%s分钟前" % (int(timestamp / 60))  # 转成整数
    elif timestamp <= 60 * 60 * 24:
        return "%s小时前" % (int(timestamp / (60 * 60)))
    elif timestamp <= 60 * 60 * 24 * 30:
        return "%s天前" % (int(timestamp / (60 * 60 * 24)))
    return value.strftime('%Y/%m/%d %H:%M')




原文地址:https://www.cnblogs.com/tangpg/p/9298641.html