django-区分时区的时间类型

本文介绍了在Django项目中如何正确地处理时区问题,并详细解释了清醒时间(aware time)与幼稚时间(naive time)的区别。同时,提供了一个过滤器函数用于计算并展示时间与当前时间的距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 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')

 





posted on 2018-07-12 11:31 .Tang 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tangpg/p/9298641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值