web-dev-qa-db-ja.com

ヒスイのテンプレートで日付をフォーマットしようとしています

私は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)}
17
babbaggeii

残念ながら特に簡単ではありません。テンプレートの内部または外部で文字列をフォーマットする(そしてきれいな文字列を渡す)関数が必要です。

こんな感じ(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)}
10
Ed Hinchliffe

私の解決策は:

次のように momentjs をExpressアプリケーションのローカルに追加します。
app.locals.moment = require('moment');

次に、どのjadeファイルでもモーメントを使用できます。
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

参照:
サーバー側のJadeテンプレートでユーティリティライブラリを使用する

57
Zhifeng Hu

Zhifeng H からの上記の解決策は私に正しい方向を与えました。残念ながら、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')
4
morecore

私は@Zhifeng Huに似たアプローチを取るのが好きですが、すべてをローカルに要求する代わりに、「require」を要求するだけで、必要に応じてテンプレートに物事を取り込むことができます。

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

そして、ジェイド/パグで

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

基本的には同じですが、requireのコードを使用するテンプレートに保持できます。

1
McB