Django模板中AJAX返回日期如何格式化为与{{date|timesince}}效果一致
解决方案
有两种常用实现思路,可根据你的业务场景选择:
方案1:后端预处理后返回(推荐,和Django原生效果完全一致)
直接在后端接口构造返回数据时,用Django自带的timesince过滤器处理日期字段,把格式化后的字符串直接返回给前端,不需要前端做额外处理。
示例代码(Django视图层):
from django.template.defaultfilters import timesince from django.utils import timezone # 构造返回数据时 message_data = { "date": your_date_object, # 直接把格式化好的timesince结果加进去 "date_timesince": timesince(your_date_object, timezone.now()) + "前" }
前端直接取这个字段使用即可:
var temp = "<p><b>" + response.messages[key].date_timesince + "</b><br></p>"
这个方案的优势是和Django模板里{{ date|timesince }}的输出效果100%一致,不需要额外处理时区、语言适配的问题。
方案2:前端JS实现timesince逻辑
如果你不方便修改后端接口,可以在前端写JS函数处理ISO格式的日期字符串,实现相同效果,示例函数如下:
function timesince(dateStr) { const date = new Date(dateStr); const now = new Date(); const diffInSeconds = Math.floor((now - date) / 1000); const units = [ {label: "年", seconds: 31536000}, {label: "月", seconds: 2592000}, {label: "周", seconds: 604800}, {label: "天", seconds: 86400}, {label: "小时", seconds: 3600}, {label: "分钟", seconds: 60}, ]; for (let unit of units) { const count = Math.floor(diffInSeconds / unit.seconds); if (count > 0) { return `${count}${unit.label}前`; } } return "刚刚"; }
调用的时候直接传接口返回的日期字符串即可:
var temp = "<p><b>" + timesince(response.messages[key].date) + "</b><br></p>"
如果需要完全对齐Django的输出规则(比如超过1年显示年和月,小于1分钟显示0分钟),可以自行调整上面函数的判断逻辑。
内容的提问来源于stack exchange,提问作者user16728502
相关产品推荐
相关产品推荐

