You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按日期筛选并列出Firestore中的数据?

解决Firestore按日期筛选同一天数据的问题

你的代码里odeme['bitis'] == tarih不生效,核心原因是DateTime对象的比较会精确到时分秒,而Firestore中存储的bitis字段大概率包含具体时间(比如Timestamp类型),和你从DatePicker获取的pickedDate(默认是当天00:00:00)无法完全匹配。下面是两种解决思路:

一、客户端过滤(快速修改现有代码)

  1. 先将Firestore中的bitis字段转换为DateTime对象:

    • 如果bitis是Timestamp类型:
      DateTime bitisDate = (odeme['bitis'] as Timestamp).toDate();
      
    • 如果bitis是存储的日期字符串(比如dd.MM.yyyy格式):
      DateTime bitisDate = DateFormat('dd.MM.yyyy').parse(odeme['bitis']);
      
  2. 编写一个只比较年月日的辅助函数:

    bool isSameDay(DateTime date1, DateTime date2) {
      return date1.year == date2.year &&
          date1.month == date2.month &&
          date1.day == date2.day;
    }
    
  3. 修改筛选条件,替换原来的odeme['bitis'] == tarih:

    if (searchString == '' ||
        odeme['firma'].toString().toLowerCase().contains(searchString.toLowerCase()) ||
        odeme['alici'].toString().toLowerCase().contains(searchString.toLowerCase()) ||
        odeme['odeme'].toString().toLowerCase().contains(searchString.toLowerCase()) ||
        isSameDay(bitisDate, tarih)) {
      // ... 返回列表项
    }
    

二、Firestore查询层面过滤(更高效推荐)

客户端过滤会加载所有数据再筛选,数据量大时性能差。推荐直接在Firestore的查询中限定日期范围:

  1. 计算所选日期的当天起始和结束时间:

    // 所选日期的00:00:00
    DateTime startOfDay = DateTime(tarih.year, tarih.month, tarih.day);
    // 次日的00:00:00,作为结束边界
    DateTime endOfDay = startOfDay.add(const Duration(days: 1));
    
  2. 修改FirestoreListView的query参数:

    FirestoreListView<Map<String, dynamic>>(
      shrinkWrap: true,
      query: FirebaseFirestore.instance
          .collection('odemeler')
          // 结合其他筛选条件,比如搜索字符串(如果需要)
          .where('bitis', isGreaterThanOrEqualTo: startOfDay)
          .where('bitis', isLessThan: endOfDay),
      itemBuilder: (context, snapshot) {
        Map<String, dynamic> odeme = snapshot.data();
        // 这里可以保留其他搜索条件的过滤
        if (searchString == '' ||
            odeme['firma'].toString().toLowerCase().contains(searchString.toLowerCase()) ||
            odeme['alici'].toString().toLowerCase().contains(searchString.toLowerCase()) ||
            odeme['odeme'].toString().toLowerCase().contains(searchString.toLowerCase())) {
          return Column(children: [
            const SizedBox(height: 10),
            // ... 你的列表项代码
          ]);
        }
        return const SizedBox.shrink(); // 不匹配的返回空组件
      },
    )
    

注意:如果bitis字段是Timestamp类型,Firestore会自动处理DateTime和Timestamp的比较,无需额外转换。

内容的提问来源于stack exchange,提问作者hilal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:07