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