【问题标题】:How to get date from mongoDB and display it, using moment.js?如何使用 moment.js 从 mongoDB 获取日期并显示它?
【发布时间】:2017-07-15 14:22:12
【问题描述】:

我有一个表单,用户以以下格式输入日期:YYYY-MM-DD

我将日期存储在 Mongo DB 中。默认情况下,Mongo DB 将其存储为 UTC 日期。

示例: 用户意见 2018-02-06 Mongo 商店:“2018 年 2 月 6 日星期二 00:00:00 GMT+0000 (UTC)”

假设我想将此日期显示给用户。

以下代码给了我错误的日期:

var eventDateString = $('#hiddenDate').val() // Just gets the date as stored in mongo
var dateObj = new Date(eventDateString)
var dateMom = moment(dateObj).format('dddd, MMMM DD YYYY');
console.log(dateMom)

打印出来的是: “2018 年 2 月 5 日,星期一” 这是不正确的,日期应该是 2 月 6 日。

为什么会这样?

我试图通过这样做来解决问题:

var eventDateString = $('#hiddenDate').val();
$('#show-eventDate').text(moment.utc(eventDateString).format('dddd, MMMM DD YYYY'));

我得到了正确的结果:“2018 年 2 月 6 日,星期二”

但是,我收到以下警告:

(弃用警告:提供的值不是公认的 ISO 格式。moment 构造回退到 js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非 ISO 日期格式,并将被删除在即将发布的主要版本中。有关更多信息,请参阅http://momentjs.com/guides/#/warnings/js-date/....)

我该如何解决这个问题?

【问题讨论】:

    标签: javascript mongodb date momentjs utc


    【解决方案1】:

    这对我来说非常有效

    moment(req.body.foo , "ddd MMM DD YYYY HH:mm:ss ZZ").format("DD/MM/YYYY");
    

    【讨论】:

    • 能否请您多解释一下为什么这样做有效,以及为什么这是一个不错的选择?
    【解决方案2】:

    您非常接近解决方案,您必须使用 moment.utc 告诉 moment 您的输入是 UTC 并传递 format 参数以避免弃用警告

    代码示例:

    var eventDateString = $('#hiddenDate').val();
    var mom = moment.utc(eventDateString, 'ddd MMM DD YYYY HH:mm:ss ZZ'); 
    $('#show-eventDate').text(mom.format('dddd, MMMM DD YYYY'));
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
    
    <input id="hiddenDate" type="hidden" value="Tue Feb 06 2018 00:00:00 GMT+0000 (UTC)">
    <div id="show-eventDate"></div>

    【讨论】:

      【解决方案3】:

      这只是对 VincenzoC 回应的一个小修改

      而不是moment(eventDate....),正确的解决方案是moment.utc(.....)

      var eventDateString = $('#hiddenDate').val();
      var mom = moment.utc(eventDateString, 'ddd MMM DD YYYY HH:mm:ss ZZ'); 
      $('#show-eventDate').text(mom.format('dddd, MMMM DD YYYY'));
      

      【讨论】:

      • 我已经编辑了我的 aswer 以修复 sn-p 并且我知道 moment.utc 因为我建议在我的答案的第一部分使用它(我只是忘了在 sn -p)。我真的不明白为什么您将第一个答案标记为已接受,以及为什么您发布了这个新答案而不是评论我的答案或建议对其进行编辑。
      • 对不起。我是新手
      【解决方案4】:

      所以我这样做是为了避免折旧警告,它起作用了

      var eventDateString = $('#hiddenDate').val();
      var index = eventDateString.indexOf('00:00');
      var shortDate = eventDateString.substr(0,index-1);
      $('#show-eventDate').text(moment(shortDate, 'ddd MMM DD YYYY').format('dddd, MMMM DD YYYY'));
      

      但我不喜欢我硬编码“00:00”的想法——任何更好的解决方案都将不胜感激

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-06
        • 2015-02-24
        • 2017-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2015-10-07
        相关资源
        最近更新 更多