【问题标题】:returned value is a day later for same code hosted on firebase hosting and firebase function返回值是一天后,托管在Firebase托管和Firebase功能上的相同代码
【发布时间】:2019-10-29 15:29:39
【问题描述】:

我正在使用下面的代码来查找本周星期一 00:00:00 的时间(以毫秒为单位)。

代码在两个地方。在使用 angular 材料构建并托管在 firebase 托管上的网站中。并在firebase功能中。我观察到的是托管代码返回的值是星期二 00:00:00 而不是星期一。

不确定为什么两者都在同一个 firebase 帐户中运行时会有所不同。

代码:

 const date = new Date()
 var begWeek = findDayBegninning(getMonday(date))

function findDayBegninning(date:any){
    const ms = date.getTime();
    const msPerDay = 86400 * 1000;
    return  ms - (ms % msPerDay);
}

在 firebase 函数中显示值: 1560124800000

在托管时显示 1560211200000

【问题讨论】:

    标签: javascript firebase google-cloud-firestore firebase-hosting


    【解决方案1】:

    很可能可以通过在不同时区运行的代码来解释差异。

    Firebase Hosting 上的代码不会由 Firebase Hosting 以任何方式解释,因此很可能在访问该网站的用户的计算机上运行。这意味着new Date()是在访问者机器的时区中获取的。

    在 Cloud Functions 中运行的代码将获得一个新的 UTC 日期。

    【讨论】:

    • 用户是我坐在北美。并且确定这对其他用户来说可能是个问题。从代码的托管端获取相同的 mon 00:00:00 的正确方法是什么?
    • 如果您想为调用代码的用户获取一天的开始时间,您应该传入该用户的时区并在计算时使用它。
    • 再解释一下:firebase db 有一个名为每周的节点,它的时间戳使用上面的代码表示每周开始(周一 00:00:00)用户可以在他们的仪表板上查询这个像“每周分数”这样的数据此时 firebase 查询获取数据 /weekly/ 因此,无论用户时区如何,此键都必须与通过 firebase 触发器函数中的代码创建的相同。那么我如何始终获得相同的值?
    • 您必须定义“每周”的含义。如果它必须是每个用户一周的开始,那么由于包括他们的时区在内的各种因素,这可能会有所不同。您还可以将“每周”定义为处于通用时区(UTC 或任何其他对您的用例最有意义的时区),这简化了所需的数据模型,因为您随后将时间戳和其他日期存储在该时区(或从 UTC 派生)。
    猜你喜欢
    • 2018-11-12
    • 2020-06-13
    • 2020-06-17
    • 2018-10-31
    • 2017-08-14
    • 2021-06-18
    • 1970-01-01
    • 2020-08-03
    • 2021-04-10
    相关资源
    最近更新 更多