【问题标题】:Querying MomentJS dates on IndexedDB & AngularJS - Dates vs Strings在 IndexedDB 和 AngularJS 上查询 MomentJS 日期 - 日期与字符串
【发布时间】:2016-09-30 16:25:27
【问题描述】:

所以,我刚刚有一个很大的“哦,啪!”时刻。

我在离线应用程序中使用 MomentJS 与 AngularJS 和 IndexedDB。

我的所有记录都存储在索引date_idx 中,该索引基于对象的日期属性。

当我尝试使用以下代码根据日期运行查询时出现问题:

$scope.redoresults = function(){
  $indexedDB.openStore('records', function(store){
    $scope.upper =  moment($scope.dates.endDate).format("DD[/]MM[/]YYYY");
    $scope.downer =  moment($scope.dates.startDate).format("DD[/]MM[/]YYYY");

    var find = store.query();
    find = find.$between($scope.downer, $scope.upper, false, false);
    find = find.$index("date_idx");
    store.eachWhere(find).then(function(e){
        $scope.daterange = e;
        console.log($scope.daterange);
    });
  });
};

查询提供了奇怪的结果,有时正确,有时不正确。 直到我意识到我实际上是在查询字符串,而不是日期。 既然如此,在 01/08/2016 和 31/08/2016 之间的查询仍然会为我提供包含 20/09/2016 的结果,因为它确实是一个数字范围之间。

我觉得我在结构方面遗漏了一些东西。

对如何解决这个问题有什么意见吗?

我应该查询其他索引吗?但是,我该如何比较日期呢?

【问题讨论】:

  • 将日期存储为 ISO 字符串或时间戳

标签: javascript angularjs date momentjs indexeddb


【解决方案1】:
  • 将日期存储为日期,并使用日期进行查询。
  • 或者,将日期存储为时间戳(例如 date.getTime()),然后使用时间戳进行查询
  • 不要将日期存储为日期,然后用字符串日期查询,这会产生垃圾。
  • 不要将日期存储为字符串,然后用字符串日期查询,这样会产生垃圾。字符串值按字典顺​​序进行比较,这很容易偏离日期的比较方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2019-03-31
    • 2016-11-08
    相关资源
    最近更新 更多