Firebase 如何在firestore和cloudfunctions中正确查询日期周期

Firebase 如何在firestore和cloudfunctions中正确查询日期周期,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我收集了下一个项目,其中一个属性是日期: id: xxxxxx name: xxxx date: August 21, 2018 at 1:00:00 AM UTC+8 (timestamp) 在firebase云函数中,我试图查询某个期间的所有对象,该期间可以是天、周、年等 我想按当前服务器日期查询项目,因此我在Firebase云函数中执行此操作: let auxDate = moment(); dateStart = auxDate.startOf('day').toDate(); d

我收集了下一个项目,其中一个属性是日期:

id:   xxxxxx
name: xxxx
date: August 21, 2018 at 1:00:00 AM UTC+8 (timestamp)
在firebase云函数中,我试图查询某个期间的所有对象,该期间可以是天、周、年等

我想按当前服务器日期查询项目,因此我在Firebase云函数中执行此操作:

let auxDate = moment();
dateStart = auxDate.startOf('day').toDate();
dateEnd = auxDate.endOf('day').toDate();
await admin.firestore().collection('items')
            .where("date", ">=", dateStart)
            .where('date', '<=', dateEnd).get();
查询返回0个项目。但当我将项目日期更改为

id:   xxxxxx
name: xxxx
date: August 21, 2018 at 8:00:00 AM UTC+8 (timestamp)
查询将正确返回该项


所以现在我知道问题是关于偏移量的,但是我怎样才能解决这个问题呢?为什么firebase将所有日期保存为UTC+8?

我找到了自己问题的答案。我会详细解释

了解问题:
首先要记住,我们是在云函数中执行此查询的,因此我们不知道客户端时区。在Firestore中,所有日期均以UTC+00格式保存。因此,如果我有一个项目,如:

id:   xxxxxx
name: xxxx
date: August 22, 2018 at 12:00:00 AM UTC+8 (timestamp)
这意味着该日期等于2018年8月21日下午4:00:00 UTC+0

因此,如果我想查询以下日期之间的所有日期:

Date start: August 22, 2018 at 12:00:00 AM UTC+8 (timestamp) 
Date end: August 22, 2018 at 11:59:59 PM UTC+8 (timestamp) 
这意味着查询必须类似于:

Date start: August 21, 2018 at 04:00:00 AM UTC+0 (timestamp) 
Date end: August 22, 2018 at 03:59:59 PM UTC+0 (timestamp) 
因此,问题是当我使用
让auxDate=moment()
创建一个没有偏移的服务器时间日期时,auxDate的值是例如:
2018年8月21日晚上11:23:43 UTC+0

因此,从auxDate开始的日期变为:

auxDate start: August 21, 2018 at 12:00:00 AM UTC+0 (timestamp) 
auxDate end: August 21, 2018 at 11:59:59 PM UTC+0 (timestamp) 
正如我们所看到的,这个查询并没有填充我们必须查询的范围,许多项将被删除

问题结论:
如果我们不知道客户的时区,则无法正确查询

解决方案:
现在,我将客户端的当前时间传递给此云函数,并计算开始和结束日期:

const clientCurrentDateTime = "2018-08-22T11:23:15+08:00";
let startDate = moment(clientCurrentDateTime).utcOffset(clientCurrentDateTime).startOf('day').toDate();
let endDate = moment(clientCurrentDateTime).utcOffset(clientCurrentDateTime).endOf('day').toDate();
这将为不同的偏移量/时区创建正确的开始和结束日期时间
const clientCurrentDateTime = "2018-08-22T11:23:15+08:00";
let startDate = moment(clientCurrentDateTime).utcOffset(clientCurrentDateTime).startOf('day').toDate();
let endDate = moment(clientCurrentDateTime).utcOffset(clientCurrentDateTime).endOf('day').toDate();