【问题标题】:I am trying to get readable date from firestore我正在尝试从 firestore 获取可读日期
【发布时间】:2019-08-31 16:16:52
【问题描述】:

我正在尝试从我的 firestore 数据库中的 Timestamp 数据类型中获取可读日期。

for (var ticketDoc of ticketsSnapshot.docs) {
            var timeStamp = await ticketDoc.data().TimePreferred;
            console.log(timeStamp.toDate());
            var time = new Date(timeStamp).toDate();
            ticketDoc.data().TimePreferred = time;
            tickets.push(ticketDoc.data());
        }

我在以下位置阅读了有关类似问题的问题:

How do I convert a Firestore date/Timestamp to a JS Date()?

所以,我尝试做同样的事情,我希望输出可读日期,尽管它给了我正确的结果

console.log(timeStamp.toDate());

但它也给了我一个错误。控制台输出如下:-

2019-04-10T06:30:00.000Z
TypeError: (intermediate value).toDate is not a function

不是:我正在尝试在邮递员中获取可读日期

【问题讨论】:

标签: node.js firebase express google-cloud-firestore


【解决方案1】:

更改以下行:

var time = new Date(timeStamp).toDate();

进入这个:

var time = new Date(timeStamp).toDateString();

来自docs

一个字符串,表示给定 Date 对象的日期部分,以美式英语的人类可读形式表示。

【讨论】:

  • 现在我没有收到旧错误,但值仍然是 1554877800 秒和 0 纳秒
  • 你的时间戳变量等于多少?
  • 尝试以下操作:var time = timeStamp.toDate();
  • 你没有存储时间戳
  • 在firestore数据库中它的类型是时间戳,我手动输入的
【解决方案2】:

我不知道为什么这个时间戳对象没有 .toDate() 扩展名,但如果它有 'seconds' 和 'nanoseconds' 属性,你可以用

将其转换为 JS Data
Date(data.seconds)

【讨论】:

    【解决方案3】:

    你可以通过以下方式尝试

    {{ formatDate(new Date(data.seconds*1000)) }}
    

    您可以使用格式化日期功能以所需的格式显示。

    import moment from "moment";
    
      format_date(value) {
        if (value) {
          return moment(String(value)).format("DD/MM/YYYY");
        }
      },
    

    【讨论】:

      【解决方案4】:

      您是否尝试过将其更改为

      var time = (new Date(timeStamp)).toDateString();
      

      【讨论】:

        【解决方案5】:

        如果您文档中的TimePreferred 字段是Timestamp,您只需在其上调用toDate() 即可从中获取有效的Date 对象。

        所以:

        for (var ticketDoc of ticketsSnapshot.docs) {
            var date = ticketDoc.data().TimePreferred.toDate();
        }
        

        这些调用都不是异步的或返回一个承诺,所以你不需要await

        【讨论】:

        • 嘿弗兰克,当您获取时间戳但创建它并希望立即在应用程序上使用 .toDate() 显示该值时,它会多次生成.toDate is not a function,直到数据准备好了
        【解决方案6】:

        由于我不知道的原因,它有时不起作用,因此更安全的选择是使用时间戳中的secondsnanoseconds 属性将其转换为日期,如下所示:

        const date = new Date(timestamp.seconds*1000 + timestamp.nanoseconds/100000) 
        // construct the date from the absolute time in milliseconds
        

        注意:

        • 1 秒 = 1000 毫秒
        • 1 纳秒 = 10^-6 毫秒

        【讨论】:

          【解决方案7】:

          您必须首先确保时间戳对象是真正的时间戳类型。 为此,从 Firebase 获取时间戳后,创建时间戳对象:

          const timestampObject: Timestamp = !!timeStamp
                ? new Timestamp(timeStamp.seconds, timeStamp.nanoseconds)
                : null;
          

          【讨论】:

            猜你喜欢
            • 2020-12-09
            • 2022-01-17
            • 1970-01-01
            • 1970-01-01
            • 2022-06-16
            • 2017-12-11
            • 1970-01-01
            • 2019-06-22
            • 1970-01-01
            相关资源
            最近更新 更多