【已经解决】给坑爹的moment日期格式化整疯了。历经折磨终于解决了。
发布于 10 年前 作者 heixiaoshan 28730 次浏览 最后一次编辑是 8 年前

###model 处理分页代码

Mcontact.getTen = function(mcname,page,callback) {
	 var query = {};
      if (mcname) {
        query.mcname = mcname;
      }
      //使用 count 返回特定查询的文档数 total
      mcontactModel.count(query, function (err, total) {
        //根据 query 对象查询,并跳过前 (page-1)*10 个结果,返回之后的 10 个结果
        //sort({create_at: -1}).
        mcontactModel.find(query).skip((page - 1)*10).limit(10).exec(function (err, docs) {
          if (err) {
            return callback(err);
          } 
      		docs.forEach(function(doc) {
    		// item 对应每条记录
   			doc.create_at = moment(doc.create_at).format('YYYY MM DD');
   			doc.update_at = moment(doc.update_at).format('YYYY/MM/DD');
			})
      		console.log('docs:'+docs);
          	callback(null, docs, total);
        });
      });
};

###控制层调用代码

router.get('/', function(req, res) {
	//判断是否是第一页,并把请求的页数转换成 number 类型
    var page = req.query.p ? parseInt(req.query.p) : 1;
    //查询并返回第 page 页的 10 篇文章
    Mcontact.getTen(null, page, function (err, mcontacts, total) {
      if (err) {
        mcontacts = [];
      } 
      res.render('mcontact', {
        mcontacts: mcontacts,
        page: page,
        isFirstPage: (page - 1) == 0,
        isLastPage: ((page - 1) * 10 + mcontacts.length) == total,
        user: req.session.user,
        success: req.flash('success').toString(),
        error: req.flash('error').toString()
      });
    });
});

###EJS 显示

 <% mcontacts.forEach(function (mcontact, index) { %>
                              <tr class="">
                                  <td class="inbox-small-cells">
                                      <input type="checkbox" class="mail-checkbox">
                                  </td>
                                  <td class="view-message "><%=mcontact.mcname%><span class="label label-danger pull-right"><%=mcontact.tag%></span></td>
                                  <td class="view-message "><%=mcontact.mcemail%></td>
                                  <td class="view-message "><%=mcontact.mcpassword%></td>
                                  <td class="view-message dont-show"><%=mcontact.create_at%></td>
                                  <td class="view-message dont-show"><%=mcontact.update_at%></td>
                              </tr>
                           <% }) %>

###最终结果

	网页啊	abbc[@sina](/user/sina).com	123123	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)
	行吗	xingma[@qq](/user/qq).com	qweqweqwe	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)
	行啊	ok[@ok](/user/ok).com	qweqweqwe	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)
	好了吗	ho[@hotmail](/user/hotmail).com	qweqweqwe	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)	Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间)

##为什么格式化没有效果啊。我叉,到底是哪里出了问题?求大神指点啊 解决方法:

docs.forEach(function(doc) {
    		// item 对应每条记录
   			doc.create_at_string = moment(doc.create_at).format('YYYY-MM-DD');
   			doc.update_at_string = moment(doc.update_at).format('YYYY-MM-DD');
                      // doc.update_at = moment(doc.update_at).format('YYYY-MM-DD');  
                     /***原理无论你怎么格式化,doc.update_at这个逗比都是日期格式,
                           所以你怎么变它都会给你整成ISO-1的日期,经过3楼的大神一说,仔细一想确实啊。
                         昨晚被这个折磨了接近4个小时。资料少的可怜。
                  ***/
			})

EJS引用 <td class=“view-message dont-show”><%=mcontact.create_at_string%></td>

13 回复

//加个lean试试 mcontactModel.find(query).skip((page - 1)*10).limit(10) .lean().exec(function (err, docs) {})

没有这个方法

console.log(moment(doc.create_at).format(‘YYYY MM DD’))你看看是什么吧;

我遇到过这个问题,你callback里的参数mcontacts 是mongoose或者类似数据库访问组件直接返回的类型吧??这些类型的create_at属性其实是个function,你传递日期字符串,它又会给你转换成Date类型.

我的做法是, doc.create_at_string = moment(doc.create_at).format(‘YYYY MM DD’);

console.log(‘doc.create_at:Mon Jul 07 2014 00:00:00 GMT+0800 (中国标准时间) doc.update_at:Mon Jul 07 2014 00:00:00 GMT+0800 (中国标准时间) doc.create_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.update_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.create_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.update_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.create_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.update_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.create_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.update_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.create_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) doc.update_at:Tue Jul 08 2014 00:00:00 GMT+0800 (中国标准时间) ’)

       mcontactModel.find(query).skip((page - 1)*10).limit(10).exec(function (err, docs) {
          if (err) {
            return callback(err);
          } 
      		docs.forEach(function(doc) {
    		// item 对应每条记录
    		y=moment(doc.create_at).format('YYYY');
    		m=moment(doc.create_at).format('MM');
    		d=moment(doc.create_at).format('DD');
    		uy=moment(doc.update_at).format('YYYY');
    		um=moment(doc.update_at).format('MM');
    		ud=moment(doc.update_at).format('DD');
   			doc.create_at =y+'.'+m+'.'+d; //moment(doc.create_at).format();
   			doc.update_at =uy+'.'+um+'.'+ud;
   			console.log('doc.create_at:'+doc.create_at);
   			console.log('doc.update_at:'+doc.update_at);
// 			console.log('doc.create_at:'+doc.create_at+',doc.update_at'+doc.update_at
// 			+",moment(doc.update_at).format('YYYY'):"+moment(doc.update_at).format('YYYY')
// 			+",moment(doc.update_at).format('DD'):"+moment(doc.update_at).format('MM')
// 			+"moment(doc.update_at).format('DD'):"+moment(doc.update_at).format('DD'));
			})
      		console.log('docs:'+docs);
          	callback(null, docs, total);
        });
      });

是的。无论我怎么格式化它,就像上面我都用字符串拼接了。它还是显示那破玩意了。

感谢啊。我昨晚折腾到4点才睡。还是没搞定,查了很多网站,发现资料真TM少的可怜。今天你一说终于解决了。万分感谢啊。

我也遇到了这个问题。 一开始解决思路也是考虑从mongoose的检索或者是检索结果的foreach来解决,尝试各种方法无效。
最后,索性直接在模板端(Jade/EJS)中:
| <td class="view-message dont-show"><%=mcontact.create_at%></td> 这个位置嵌入js代码进行日期的格式化。

可以试试我这个方法。

@heixiaoshan 我反而更推荐我的方法。在dao层进行日期格式化感觉不太符合MVC。以后处理不同时区的显示等问题,也应该是放在模板或者前端js来处理,所以后端传基本日期形式是可以接受的。

@kakanjau 并不是在后台保存的时候去处理。是在传到前台来的时候进行转换,页面上直接标签就可以取了。

试试先 toObject() 然后再修改。 或者给 ejs 加 filters,输出时格式化。 ejs.filters.formatdate = util.formatdate; <%= item.create_at | formatdate %>

回到顶部