【问题标题】:Cannot overwrite date with moment.js无法用 moment.js 覆盖日期
【发布时间】:2016-07-21 04:42:37
【问题描述】:

我有一系列活动和 MongoDB。活动也有日期。我正在尝试动态构建一个表,其中包含保存在我的集合中的所有活动。因此,我想在将 JSON 对象数组发送到我的翡翠文件之前使用 moment.js 更改日期的格式。

我尝试创建一个新的结果数组并将其发送到我的玉文件。

    router.get('/', function(req, res, next) {
      activitiesController.getActivities(function(results) {
        if(!results) {
          results = [];
        }
        for(var key in results) {
          results[key].date = moment(results[key].date).format('ddd, hA');
        }
        res.render('index', {
          activities: results
        })
      });
    });

结果数组的外观如下:

[{
    "_id" : ObjectId("56fe2c0d7afcafa412ae19c2"),
    "title" : "Fitnessstudios",
    "category" : "Sport",
    "time" : 2,
    "date" : ISODate("2016-03-30T00:00:00.000Z"),
    "__v" : 0
}]

【问题讨论】:

  • 您是否在结果中获取数据?
  • 是的,我正在获取结果中的数据
  • 您能否发布有用的结果样本
  • 其实for..in可以用来循环数组。
  • @Algram 我刚刚了解到这要归功于 AJS,但它仍然很奇怪。

标签: javascript node.js mongodb pug momentjs


【解决方案1】:

改变这个:

moment(results[key].date).format('ddd, hA');

moment(new Date(results[key].date.toString()),moment.ISO_8601).format('ddd, hA');

【讨论】:

  • 你可以循环,因为他已经完成了其他一切应该可以正常工作
  • 我不知道你可以用for..in 循环数组:), I still won't use it anyway
  • 不推荐将字符串放入 moment()。 github.com/moment/moment/issues/1407
  • 我已经编辑了答案,看看它是否有效应该失去警告
  • 不,不要那样做。 moment.js 有一个非常好的解析器,它比浏览器中的常见解析器要好得多,使用它并告诉它格式。使用 Date 构造函数来解析字符串,然后生成另一个非标准的、依赖于实现的字符串,然后用 moment.js 解析它,而没有任何时间告诉解析器它得到了什么是没有意义的。
【解决方案2】:

您的问题是您传递给 moment.js 的值是:

ISODate("2016-03-30T00:00:00.000Z")

当它只需要日期字符串部分时:

"2016-03-30T00:00:00.000Z"

所以只获取日期字符串并传递它,下面的 sn-p 显示了如何做到这一点。

var dateString = 'ISODate("2016-03-30T00:00:00.000Z")'.replace(/^[^\"]+\"([^\"]+)\".*$/,'$1');

document.write(dateString);

moment.js 可能会很好地解析 ISO 字符串而无需进一步的帮助,但是我认为告诉它格式要好得多,所以你应该使用类似的东西:

var dateString = results[key].date.replace(/^[^\"]+\"([^\"]+)\".*$/,'$1');
results[key].date = moment(dateString,'YYYY-MM-DDThh:mm:ss.sssZ').format('ddd, hA');

// Wed, 10AM

并且您不应该在数组上使用 for..in,您可能会发现与您期望的属性不同的属性并且以不同的顺序。使用普通的 forwhiledo 循环或循环方法之一,如 forEachmap 等视情况而定。

【讨论】:

  • 再想一想,正则表达式可以简化为/\"([^\"]+)\"/,字符串的其余部分就不用匹配了。
  • 不起作用。问题可能是,我用 date: Date 定义了一个 activitySchema,我尝试在我的 for 循环中传递的日期格式不再适合这个模式?
  • 我不知道。 results[key].date 的实际值和类型是什么(例如日期、字符串……)?我以为它是字符串 'ISODate("2016-03-30T00:00:00.000Z")' 但也许这就是你在控制台中得到的?
  • 值是 Wed Mar 30 2016 02:00:00 GMT+0200 (Mitteleuropäische Sommerzeit),当我将 typeof results[key].date 登录到控制台时,它只显示对象。
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多