得到错误的结果:从 AngularJS 访问 api 并使用 NodeJS 从 firebase 查询结果时出现时区问题

Posted

技术标签:

【中文标题】得到错误的结果:从 AngularJS 访问 api 并使用 NodeJS 从 firebase 查询结果时出现时区问题【英文标题】:Getting wrong results: Time-zone issue when hitting api from AngularJS and querying for result from firebase using NodeJS 【发布时间】:2022-01-07 04:07:09 【问题描述】:

使用日期范围查询时返回错误的结果。

我正在使用 DateRangePicker jQuery 来选择日期范围和时间范围。

然后我点击我的 api 并将我的日期/时刻 js 对象发送到我的节点 js api,我在该 api 上查询 firestore 以获取在特定日期范围内添加的文档!

这是我的代码:

api.get('/getDoc', async function(req,res)

var start = new Date(req.query.fromDateData);
var end = new Date(req.query.toDateData);

ref = db.collection(req.query.brand);


if(! req.query.alert=='')
    ref = ref.where(req.query.alert,'==',true);


ref= ref.where('firebaseAddDate', '>', start).where('firebaseAddDate', '<', end).orderBy('firebaseAddDate', 'desc');

ref = await ref.limit(50).get();

如果我输入这个日期:

fromDateData: 'Mon Nov 29 2021 00:00:00 GMT 0500 (Pakistan Standard Time)',
toDateData: 'Mon Nov 29 2021 23:59:00 GMT 0500 (Pakistan Standard Time)',

我得到结果

Mon Nov 29 2021 04:xx:00
Tue Nov 30 2021 04:xx:00

我比定义的时间提前 5 小时获得结果。不知道如何处理这个问题,我尝试过更改偏移量并使用 utc 和使用纪元时间。但无法处理。 这是我要查询的变量:

【问题讨论】:

您的问题不是很清楚,但您应该注意 Firestore 中的日期/时间以 UTC 格式存储。也许这会帮助你找出你的问题 @NoCommandLine 让我用 utc 再次检查一下,我会跟进! 【参考方案1】:

我会回答我的问题,这可能会对我的用例有所帮助:-

当使用 jQuery Date-Range-Picker 和这样的时间范围时

记得这样设置时区:

$('#dateRange').daterangepicker(
    timePicker: true,
    timePicker24Hour: true,
    startDate: moment().subtract(1,'days').startOf("day").utc(),
    endDate:moment().endOf("day").utc(),
    opens: 'left',
    showTimezone: true, 
    timezone: "+0000"
, async function(start, end, label) 
    $scope.fromDateData= await start.utc(); //.format('DD-MM-YYYY H:mm');
    $scope.toDateData= await end.utc(); //.format('DD-MM-YYYY H:mm');
    console.log(`A new date selection was made: $$scope.fromDateData to $$scope.toDateData`);
    $scope.ff=true;
    $scope.$digest();
);

现在在 NodeJS 中查询 firebase firestore 的日期范围时。确保您的对象以纪元时间格式保存。你可以用这个方法做到这一点:

var current_date_utc =  Date.UTC(current_date.getUTCFullYear(), current_date.getUTCMonth(), current_date.getUTCDate(),
    current_date.getUTCHours(), current_date.getUTCMinutes(), current_date.getUTCSeconds()); //will store in format of numbers

const ref = await db.collection('saud').doc().set(
    'firebaseAddDate': current_date_utc,
);

现在,如果您的日期以纪元时间格式存储,则可以使用日期范围查询文档。您将使用此方法:

//api is hit
api.get('/getDoc', async function(req,res)
//api body
console.log(req.query);
var start = new Date(req.query.fromDateData);
var end = new Date(req.query.toDateData);

//setting utc date format that is same as epoch time format
var start_utc =  Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(),
    start.getUTCHours(), start.getUTCMinutes(), start.getUTCSeconds());
var end_utc =  Date.UTC(end.getUTCFullYear(), end.getUTCMonth(), end.getUTCDate(),
    end.getUTCHours(), end.getUTCMinutes(), end.getUTCSeconds());

ref = db.collection('saud');

if(! req.query.alert=='')
    ref = ref.where(req.query.alert,'==',true);


ref= ref.where('firebaseAddDate', '>', start_utc).where('firebaseAddDate', '<', end_utc).orderBy('firebaseAddDate', 'desc');

ref = await ref.limit(50).get();

【讨论】:

以上是关于得到错误的结果:从 AngularJS 访问 api 并使用 NodeJS 从 firebase 查询结果时出现时区问题的主要内容,如果未能解决你的问题,请参考以下文章

从使用 AngularJS 开发的网站获取数据访问权限

AngularJs,路由,创建多个路由的问题

如何使用 NodeJS + AngularJS 从文件中删除一些奇怪的错误

AngularJs 错误:“达到 10 个 $digest() 迭代。中止!”

如何在angularjs中链接promise错误函数

AngularJS延迟错误:参数'fn'不是函数,得到对象