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 的评论之后):

-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)}
4

5 回答 5

62

我的解决方案是:

momentjs添加到您的 express 应用程序本地,如下所示:
app.locals.moment = require('moment');

然后你可以在任何玉文件中使用时刻:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

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

于 2014-09-20T16:33:30.803 回答
11

不幸的是,这并不容易。您需要一个函数来在模板内部或外部格式化字符串(并传递漂亮的字符串)。

像这样的东西(玉)

-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)}
于 2013-06-04T16:17:07.407 回答
6

胡志峰的上述解决方案给了我正确的方向。不幸的是 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')
于 2017-03-01T15:16:54.167 回答
2

我喜欢采用类似于@Zhifeng Hu 的方法,但我不需要将所有内容都放入本地,我只需要“require”,然后我可以根据需要在模板中提取内容。

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

然后在 Jade/Pug

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

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

于 2018-11-19T20:24:36.233 回答
-3

您应该在服务器端格式化日期。将模板内完成的逻辑数量限制在最低限度 - 理想情况下什么都不做。

于 2014-07-16T15:16:09.157 回答