• django中aware和navie time的用法


    今天想实现这样一个需求,记录用户创建某条数据距离现在的时间

    通过下述代码创建一个tag模型:

    class Tag(models.Model):
        tagname = models.CharField(max_length=20,null=False)
        create_time = models.DateTimeField(auto_now_add=True,null=True)
        class Meta:
            db_table = 'tag'

    自定义一个过滤器用来实现该功能:

    from datetime import datetime
    from django import template
    register = template.Library()
    def timer(value):
        now_time = datetime.now()
        dis_time = now_time-value
        total_time = dis_time.total_seconds()
        if total_time < 60:
            return "%d秒以前"%total_time
        if total_time > 60 and total_time<60*60:
            total_time = int(total_time/(60))
            return "%d分钟以前"%total_time
        if total_time > 60*60 and total_time <60*60*24:
            total_time = int(total_time/(60*60))
            return "%d小时以前"%total_time
        if total_time > 60*60*24:
            total_time =  int(total_time/(60*60*24))
            return "%d天以前"%total_time
    register.filter("timer",timer)

    报错如下:

    这是由于aware time和naive time所造成的

    我们采用的解决办法有两个:

    1、将模型 的aware time转换为naive time

    2、将过滤器中的naive time转化为aware time

    笔者首先采用方法一,事实证明不可行,报错为model不可以被调用

    然后采用方法二:

    通过如下代码将naive time转化为aware time

    from django.utils.timezone import now
    from pytz import timezone
    from datetime import datetime
    from django import template
    register = template.Library()
    def timer(value):
        now_time = datetime.now()
        now_time_1 = now_time.replace(tzinfo=timezone('UTC'))
        dis_time = now_time_1-value
        total_time = dis_time.total_seconds()
        if total_time < 60:
            return "%d秒以前"%total_time
        if total_time > 60 and total_time<60*60:
            total_time = int(total_time/(60))
            return "%d分钟以前"%total_time
        if total_time > 60*60 and total_time <60*60*24:
            total_time = int(total_time/(60*60))
            return "%d小时以前"%total_time
        if total_time > 60*60*24:
            total_time =  int(total_time/(60*60*24))
            return "%d天以前"%total_time
    register.filter("timer",timer)

    效果如下:

    结果发现时间与真实的时间相差八个小时,这是由于我们采用的UTC时区所造成的,当然仍然是不可行的,

    后来的解决办法如下:

    from django.utils.timezone import now
    from django import template
    register = template.Library()
    def timer(value):
        now_time = now()
        dis_time = now_time-value
        total_time = dis_time.total_seconds()
        if total_time < 60:
            return "%d秒以前"%total_time
        if total_time > 60 and total_time<60*60:
            total_time = int(total_time/(60))
            return "%d分钟以前"%total_time
        if total_time > 60*60 and total_time <60*60*24:
            total_time = int(total_time/(60*60))
            return "%d小时以前"%total_time
        if total_time > 60*60*24:
            total_time =  int(total_time/(60*60*24))
            return "%d天以前"%total_time
    register.filter("timer",timer)

    可以发现实现了该功能

    总结:1、在django中支持时区,这是一个好消息也是一个坏消息

    好处是我们可以进行国际化操作

    坏处是如果我们不需要国际化,就会造成时间误差

    2、

    from django.utils.timezone import now

    通过引入这个包的now方法,这个时间是带时区的,与模型中的时间保持一致

    from datetime import datetime

    引入这个包中的时间是不带时区的,因此会产生八个小时的时差

  • 相关阅读:
    VisualSVN 4.0.11补丁原创发布
    用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
    树霉派4B换国内源注意事项
    StepShot4.3.0安装包_KeyGen发布
    NoSQL Manager for Cassandra 3.2.0.1 带Key
    NoSQL Manager for MongoDB 4.6.0.3 带key
    数值分析 三次样条插值及实现
    POJ 1753 Flip Game 暴力 深搜
    最短路问题 Dijkstra算法- 路径还原
    任意两点间的最短路问题 Floyd-Warshall算法
  • 原文地址:https://www.cnblogs.com/gaoshiguo/p/12323228.html
Copyright © 2020-2023  润新知