21

我需要在 django 模板中显示帖子的时间戳。时间戳如下:

"timestamp":1337453263939 in milli seconds

我可以将时间戳转换为日期时间对象并将其呈现在视图中。有没有直接通过模板显示的方式?输出应该是:

print(datetime.datetime.fromtimestamp(1337453263.939))
2012-05-20 00:17:43.939000
4

5 回答 5

93
{% now "U" %}

"U"是 Unix 纪元的日期格式,也可以与内置date过滤器一起使用。因此,如果您在变量中有日期:

{{ value|date:"U" }}
于 2012-09-17T09:59:43.773 回答
29

您可以使用自定义模板过滤器(请参阅https://docs.djangoproject.com/en/dev/howto/custom-template-tags/)。在你的情况下,它可能是这样的:

  1. 在具有视图的应用程序中创建目录“templatetags”,以呈现模板。
  2. 将代码放入此目录空白文件“__init__.py”和“timetags.py”:

    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)
    
  3. 在您的模板中,添加

    {% load timetags %}
    
  4. 在模板中使用以下语法:

    {{ timestamp|print_timestamp }}
    

    在您的示例中,时间戳 = 1337453263.939

这将以本地日期和时间格式打印时间戳。如果要自定义输出,可以通过以下方式修改 print_timestamp:

import time
def print_timestamp(timestamp):
    ...
    #specify format here
    return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(ts))
于 2012-05-23T08:07:25.230 回答
1

也许您可以使用日期过滤器: https ://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#date

于 2012-05-23T07:40:02.153 回答
1

我不认为日期过滤器需要时间戳,所以除非我正在监督过滤器,否则您可以简单地创建一个?

# python
from datetime import datetime

# django
from django import template


register = template.Library()

@register.filter("timestamp")
def timestamp(value):
    try:
        return datetime.fromtimestamp(value)
    except AttributeError, e:
        catch errors..
于 2012-05-23T07:41:54.450 回答
0

只需编写一个自定义过滤器,将您的时间戳字符串转换为日期时间对象。然后,您可以将其进一步处理为可读的内容(表示您的时间的字符串)并将其返回到您的模板,或者只返回一个 python 日期时间对象并使用 django 的日期过滤器。

所以你可以有这样的东西 {{ timestamp_string|convert_to_datetime|date:'D d M Y' }}

有关此主题的更多信息,请访问:https ://docs.djangoproject.com/en/dev/howto/custom-template-tags/

于 2012-05-23T07:45:20.140 回答