【问题标题】:Querying data between two dates from Firestore using LocalDate使用 LocalDate 从 Firestore 查询两个日期之间的数据
【发布时间】:2019-08-29 19:03:14
【问题描述】:

我正在尝试从 Firestore 获取两个选定日期之间的订单,但问题是我的查询总是返回 0 个快照/文档。

我正在使用LocalDate 类,因为我有一个JavaFX 程序并且日期选择器也返回LocalDate。我知道 Firestore 正在使用它的时间戳,但我不确定如何正确地将 LocalDate 转换为 Firestore 时间戳。尝试使用 java.sql.Timestamp,但它不起作用。有什么建议吗?

private static LocalDate dateFrom, dateTo;   
//...//

    Query query = null;
                if (dateTo == null) {
                    dateTo = LocalDate.now();

                    Timestamp timeTo = Timestamp.valueOf(dateTo.atStartOfDay());
                    Timestamp timeFrom = Timestamp.valueOf(dateFrom.atStartOfDay());
                    query = orderRef.whereLessThanOrEqualTo("orderTimestamp", timeTo).whereGreaterThan("orderTimestamp", timeFrom);
                } else if (dateTo.equals(dateFrom)) {
                    Timestamp timeFrom = Timestamp.valueOf(dateFrom.atStartOfDay());
                    query = orderRef.whereEqualTo("orderTimestamp", timeFrom);
                } else {
                    Timestamp timeTo = Timestamp.valueOf(dateTo.atStartOfDay());
                    Timestamp timeFrom = Timestamp.valueOf(dateFrom.atStartOfDay());
                    query = orderRef.whereLessThanOrEqualTo("orderTimestamp", timeTo).whereGreaterThan("orderTimestamp", timeFrom);
                }

【问题讨论】:

标签: java android firebase google-cloud-firestore


【解决方案1】:

我在您的数据库中看到,您的 orderTimestamp 属性包含一个 Timestamp 值,这是正确的。如果您想使用whereLessThanOrEqualTo() 查询数据库,您可以简单地将Date 对象作为第二个参数传递。看,这个类是java.util 包的一部分。无需将任何日期值转换为时间戳。

【讨论】:

    【解决方案2】:

    最终解决方案是使用 com.google.cloud.Timestamp.of(Date) 作为本教程中的参数:

    https://code.luasoftware.com/tutorials/google-cloud-firestore/understanding-date-in-firestore/

    Instant instant = dateTo.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
                    Date dateTo = Date.from(instant);
                    Instant instant2 = dateFrom.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
                    Date dateFrom = Date.from(instant2);
                    query = orderRef.whereLessThanOrEqualTo("orderTimestamp", Timestamp.of(dateTo)).whereGreaterThan("orderTimestamp", Timestamp.of(dateFrom));
    

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2018-07-25
      • 2014-12-28
      相关资源
      最近更新 更多