得到错误的结果:从 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 查询结果时出现时区问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NodeJS + AngularJS 从文件中删除一些奇怪的错误