尝试在Jade模板中格式化日期

18

我有一个index.js:

exports.index = function(req, res){
  db.courses.find(function(err, currentCourses) {
    res.render('index', {
      currentCourses: currentCourses
    });
  });
};

在我的翡翠模板上:

tr
    td #{currentCourses[0].start}

一个日期,格式为“Sun Sep 29 2013 00:00:00 GMT+0100 (BST)”。
如何将其格式化为“2013年9月29日”?

编辑(根据Ed Hinchliffe的评论):

一段日期,格式为“Sun Sep 29 2013 00:00:00 GMT+0100 (BST)”。

-function prettyDate(dateString){
    -var d = date.getDate(dateString);
    -var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
    -var m = monthNames[date.getMonth()];
    -var y = date.getFullYear();
    -return d+' '+m+' '+y;
-} 
for course in currentCourses
    tr
        td #{prettyDate(course.start)}
5个回答

62

我的解决方案是:

像这样将momentjs添加到您的express应用程序本地环境中:
app.locals.moment = require('moment');

然后您可以在任何jade文件中使用moment:
span='(创建于: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

参考:
在服务器端Jade模板中利用实用程序库


td= moment(obj.timestampSent).format('DD.MM.YYY') - Jadeye
好的答案,简单明了。相比传统的 script(src='moment.min.js'),这种方法有什么好处吗? - Felipe

12

很不幸,这并不容易。你需要编写一个函数来格式化一个字符串,可以在你的模板内部或外部使用(并传递漂亮的字符串)。

类似于这样(JADE):

-function prettyDate(dateString){
    //if it's already a date object and not a string you don't need this line:
    -var date = new Date(dateString);
    -var d = date.getDate();
    -var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
    -var m = monthNames[date.getMonth()];
    -var y = date.getFullYear();
    -return d+' '+m+' '+y;
-}


tr
   td #{prettyDate(currentCourses[0].start)}

啊,好的。如果你把这个函数放在模板之外,你会怎样传递它呢? - babbaggeii
具有完全相同的功能(不包括“-”转义字符),并在字符串上首先调用它。假设您在对象数组中有很多这些,最好只保留它在模板中,而不是首先迭代整个对象并将它们全部转换。 - Ed_
谢谢你。我已经添加了那段代码(请看我的编辑),但是现在我遇到了以下错误:> 57 | -var d = date.getDate(); 对象没有getDate方法。有什么想法吗? - babbaggeii
别担心,我已经更正了我的代码,现在它可以正常运行了。非常感谢! - babbaggeii

7
上述解决方案来自于Zhifeng Hu,它为我指明了正确的方向。不幸的是, app.locals.moment 对我并没有起作用。
但是你可以将require('moment')直接传递到模板属性对象中。
var data = {
  title: 'some nice title',
  updateDate: new Date(),
  ....,
  moment: require( 'moment' )
};

然后像往常一样将数据对象传递给模板函数。

var template = pug.compile( source );
var html = template( data );

源文件示例:

doctype html
html
  head
    title= title
  body
    div= moment(updateDate).format('YYYY-MM-DD')

2

我倾向于采用与@Zhifeng Hu类似的方法,但不是将所有内容都放入locals中,而是只需要“require”,然后在模板中按需引用。

app.use((req, res, next) => { res.locals.require = require; next() })

然后在Jade/Pug中:

- const moment = require('moment')
div Created at: #{moment(data.createdAt).fromNow()}

基本上是一样的,但我可以把所需的代码保留在使用它的模板中。


-3

你应该在服务器端格式化日期。尽量减少模板内部的逻辑处理 - 最好是完全没有。


26
我不同意这个观点。类似日期格式化这样的展示性内容应该放在模板中处理,而不是控制器等其他位置进行处理。 - Rob Fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接