gpt4 book ai didi

google-cloud-firestore - 云防火墙 : Storing and querying for today's date over multiple UTC offsets?

转载 作者:行者123 更新时间:2023-12-04 00:03:19 24 4
gpt4 key购买 nike

我正在使用 Firestore 编写一个需要能够显示“今日热门帖子”的网络应用程序,并且在考虑不同时区的用户时无法正确查询。

日期作为 UTC 0 存储在数据库中,然后通过 Moment.js 调整为客户端中当前用户的 UTC 偏移量。 .这工作正常。

添加新帖子时,我使用 firebase.firestore.FieldValue.serverTimestamp()将当前服务器时间戳存储在名为 timestamp 的字段中,像这样:

const collectionRef = db.collection('posts');
collectionRef.add({
name: "Test Post",
content: "Blah blah blah",
timestamp: firebase.firestore.FieldValue.serverTimestamp(),
likeCount: 0
});

然后在服务器上,我有一个在创建时运行的云函数,并将另一个字段添加到名为 datestamp 的文档中。这是 UTC 0 时间戳,但经过调整以使时间是一天的开始。该函数如下所示:
exports.updatePostDate = functions.firestore
.document('posts/{postID}')
.onCreate((event) => {
const db = admin.firestore();
const postRef = db.doc('post/'+event.params.postID);
const postData = event.data.data();

const startOfDay = moment(postData.timestamp).startOf('day').toDate();

return postRef.update({
datestamp: startOfDay
});
});

存储时间始终是一天开始的时间戳使我能够编写这样的查询来查找所有帖子并按特定日期的流行度排序:
const startOfDayUTC = moment.utc().startOf('day').toDate();
const postQuery = db.collection('posts')
.orderBy('likeCount', 'desc')
.orderBy('timestamp', 'desc')
.where('datestamp', '==', startOfDayUTC)
.limit(25);

问题是,根据用户的 UTC 偏移量,这可以在解析帖子的 timestamp 时显示具有两个不同日期的帖子。 field 。因此,即使查询正确获取了 datestamp 所在的所有帖子也就是说,2018-01-30T00:00:00Z, timestamp解析后的日期可能不同。这是两个帖子的示例:
Post 2:
likeCount: 1
timestamp (UTC 0): 2018-01-30T06:41:58Z
timestamp (parsed to UTC-8): 2018-01-29T22:41:58-08:00
datestamp (UTC 0): 2018-01-30T00:00:00Z

Post 1:
likeCount: 0
timestamp (UTC 0): 2018-01-30T10:44:35Z
timestamp (parsed to UTC-8): 2018-01-30T02:44:35-08:00
datestamp (UTC 0): 2018-01-30T00:00:00Z

所以你可以看到,虽然帖子有相同的 datestamp ,调整后 timestamp到本地 UTC, timestamp字段可能会在两个不同的日子结束。

如果有人对此有解决方案,我将不胜感激。

最佳答案

我认为在这种情况下最好避免使用函数,因为您现在可以执行复合查询。你可以简单地使用

query.where(date > lastMidnight).where(data < now).get().then(...)

可以这么说来限制仅属于一天的数据并尝试将所有时间变量保持在 UTC 0 中,只需在客户端找到起点和当前时间并将它们转换为 UTC0。
//get local time from midnight to now (local)
const now = new Date();
const lastMidnight = now.setHours(0,0,0,0);

//then convert those to UTC0 to pass on in your query to firestore
const lastMidNightUTC = new Date(lastMidnight + now.getTimezoneOffset() * 60000).toString();
const nowInUTC = new Date(now + now.getTimezoneOffset() * 60000).toString();

并且您可以获取您的数据(请记住,您需要创建索引或只运行一次查询,firebase SDK 将生成一个链接以在开发工具 -> 控制台中为您创建索引)
    query.where(date > lastMidNightUTC).where(data < now).get().then(...)

关于google-cloud-firestore - 云防火墙 : Storing and querying for today's date over multiple UTC offsets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com