在EJS中截取日期对象的时间戳——JavaScript、HTML、Node.js
解决EJS中日期截取无内容的问题
我完全懂你现在的困扰——在EJS页面循环展示对象时,完整日期能正常显示,但一尝试截取日期里的时间戳部分就啥都不出来了,这确实挺闹心的。咱们一步步来排查解决:
先搞清楚核心问题:日期的类型是关键
你能看到完整日期,但截取后无内容,大概率是因为你直接对Date对象用了字符串截取方法(比如slice),而不是先把它转成字符串。当然也有可能是日期字符串的格式和你预期的不一样,或者属性值为空。
分情况给出解决方案
情况1:你的date属性是Date对象
如果是从数据库(比如MongoDB)拿到的Date对象,直接调用slice会失效,因为Date对象本身没有这个方法。你需要先把它转成字符串,再截取:
<% maps.forEach(function(map) { %> <div class="map-card"> <!-- 完整日期展示 --> <p>完整日期:<%= map.date %></p> <!-- 转成ISO字符串后截取YYYY-MM-DD部分 --> <p>日期部分:<%= map.date.toISOString().slice(0, 10) %></p> <!-- 或者用本地化日期格式,更友好 --> <p>本地化日期:<%= map.date.toLocaleDateString('zh-CN') %></p> </div> <% }) %>
情况2:你的date属性是字符串,但格式不符合预期
先把完整的日期字符串打印出来,确认它的格式(比如是"2024-05-20T12:34:56"还是"2024/05/20 12:34"),再调整截取的索引:
<% maps.forEach(function(map) { %> <div class="map-card"> <!-- 先打印完整字符串,确认格式 --> <p>完整日期字符串:<%= map.date %></p> <!-- 根据实际格式修改slice参数,比如格式是YYYY/MM/DD HH:mm,就取前10位 --> <p>截取后的日期:<%= map.date.slice(0, 10) %></p> </div> <% }) %>
情况3:防止date属性为空导致的渲染失败
有时候对象的date属性可能是null或undefined,直接调用方法会报错,导致页面部分内容不显示。可以加个条件判断:
<% maps.forEach(function(map) { %> <div class="map-card"> <p>日期:<%= map.date ? map.date.toISOString().slice(0, 10) : '无日期数据' %></p> </div> <% }) %>
小提示
如果还是有问题,可以在EJS里用<% console.log(map.date) %>把日期值打印到控制台,看看它的类型和具体内容,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者Blake Lewis




