Django如何将timestamp时间戳在template改成时间

先说一下配置:
Django:2.1.8
Python:3.6.4
project的名称是:naxx
APP的名称是:naxxramas

template的除法与as

我们在用Django搭配平台API的时候,经常会得到各种各样形式的数据。那么views.py获取到这些数据之后,需要通过template向前端展示。但是往往由于API数据的格式多种多样,比如API提供的是时间戳timestamp,而前端需要展示的是可读的时间,这种变化怎么办?

比如我们公司的一个监控系统,对外暴露的API格式如下:

1
{"data":{"attends":null,"metadata":null,"result":[{"timestamp":1598369220000,"avg_cpu":1.6593},{"timestamp":1598369280000,"avg_cpu":1.6854},{"timestamp":1598369340000,"avg_cpu":1.6552},{"timestamp":1598369400000,"avg_cpu":1.7705}]},"message":"","success":true,"totalCount":null}

可以看出返回的是某个应用最近5分钟的CPU情况。那么如果要展示到前端,就需要对timestamp进行二次加工。原来的代码是:

1
2
3
4
{% for app in data %}
{{ app.timestamp }}
{{ app.avg_cpu }}
{% endfor %}

首先第一步,timestamp这个值并不是一个正确的时间戳,如图:
akb48

可见它是真实时间戳的1000倍,所以我们要先将其除以1000。那么更改代码如下:
akb48

这里就达到了将原来app.timestamp除以1000的效果。但是要注意,这样就不能继续加工了,即在后面加上|date:"D d M Y" %}这个过滤器是会报错的,因为widthratio只能接受int类型。

既然这样,我们就中转一下使用as,改成这样:
akb48

这里通过as来解决问题,先用除法将结果赋予timestamp,然后再对timestamp进行print_timestamp的加工展示。

自定义template过滤器

在上面那个例子里,我用了print_timestamp这个模板过滤器,这是一个自定义的过滤器,因为Django2目前没有官方的时间戳转时间的过滤器。所以就要手写一个,手写的过程如下:

首先现在你的App文件夹里,创建一个空文件夹templatetags,里面先创建一个空文件__init__.py。这个空文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数。

然后再创建一个叫timetages.py的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from django import template
import datetime
register = template.Library()

def print_timestamp(timestamp):
try:
#assume, that timestamp is given in seconds with decimal point
ts = float(timestamp)
except ValueError:
return None
return datetime.datetime.fromtimestamp(ts)

register.filter(print_timestamp)

如果你要精确到小时分秒这个级别的话,上面的代码就要对应补充和修改一下:

1
2
3
4
5
import time
def print_timestamp(timestamp):
...
#specify format here
return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(ts))

然后在对应的html文件里,添加load 文件名,注意是文件名不是文件里的函数名,如图:
akb48

此时我们自定义的print_timestamp函数就OK了,重启一下django,一定要重启,看看效果吧!
akb48

参考资料

https://blog.csdn.net/u011181633/article/details/79337369
https://stackoverflow.com/questions/10715253/display-timestamp-in-django-template
akb48

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------