使用LocalDate从Firestore查询两个日期之间的数据

时间:2019-08-29 19:03:14

标签: java android firebase google-cloud-firestore

我正在尝试从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);
                }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

最终解决方案使用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));