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

获取上一年年份时出错,无法正确筛选2017年订单

问题:获取上一年日期时得到1970年,无法查询对应订单

你本来想获取当前年份的上一年(期望得到2017年),但运行代码后日志输出了Thu Jan 01 00:00:02 GMT+00:00 1970,导致完全查不到2017年的订单。咱们一步步拆解问题,修正代码:

你的原核心代码片段

private void lastyear() {
    pd = new ProgressDialog(getActivity());
    pd.setTitle("Please Wait...");
    pd.setCancelable(false);
    pd.show();

    Date lastyear = new Date();
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(lastyear.getTime());
    calendar.add(Calendar.YEAR, -1);
    lastyear = new Date(calendar.get(Calendar.YEAR)); // 这里是错误根源!
    Log.e("lastyear", String.valueOf(lastyear));

    db.collection("Orderers").document(user_id).collection("OpenOrders")
            .whereEqualTo("OrderPlacedDateTime", lastyear) // 精确匹配错误时间
            .orderBy("OrderPlacedDateTime", Query.Direction.DESCENDING)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                // ... 后续逻辑省略
            });
}

错误原因分析

  1. 日期构造错误:new Date(calendar.get(Calendar.YEAR))完全用错了Date的构造方法——Date(long date)接收的是从1970年1月1日0点开始的毫秒数,而calendar.get(Calendar.YEAR)返回的是年份数值(比如2017)。把2017作为毫秒数传入,得到的自然是1970年1月1日加上2017毫秒的结果,也就是日志里的错误时间。
  2. 查询逻辑错误:就算你构造出正确的2017年1月1日,用whereEqualTo去匹配OrderPlacedDateTime也不对——订单的下单时间是具体到时分秒的,不可能都精确等于某一天的0点,这样依然查不到数据。

修正方案:查询上一年的完整时间范围

你需要的是匹配整个上一年的所有订单,所以应该构造上一年的起始和结束时间,用范围查询来筛选:

private void lastyear() {
    pd = new ProgressDialog(getActivity());
    pd.setTitle("Please Wait...");
    pd.setCancelable(false);
    pd.show();

    // 计算上一年的起始与结束时间
    Calendar calendar = Calendar.getInstance();
    // 先切换到上一年
    calendar.add(Calendar.YEAR, -1);
    // 设置为上一年1月1日 00:00:00
    calendar.set(Calendar.MONTH, Calendar.JANUARY);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    Date startOfLastYear = calendar.getTime();

    // 设置为上一年12月31日 23:59:59
    calendar.set(Calendar.MONTH, Calendar.DECEMBER);
    calendar.set(Calendar.DAY_OF_MONTH, 31);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    Date endOfLastYear = calendar.getTime();

    Log.e("startOfLastYear", String.valueOf(startOfLastYear));
    Log.e("endOfLastYear", String.valueOf(endOfLastYear));

    db.collection("Orderers").document(user_id).collection("OpenOrders")
            // 用范围查询覆盖整个上一年的订单
            .whereGreaterThanOrEqualTo("OrderPlacedDateTime", startOfLastYear)
            .whereLessThanOrEqualTo("OrderPlacedDateTime", endOfLastYear)
            .orderBy("OrderPlacedDateTime", Query.Direction.DESCENDING)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        ls_data.clear();
                        for (DocumentSnapshot document : task.getResult()) {
                            if (document.exists()) {
                                // 保留你原有的数据解析逻辑
                                final String DeliveryMethod = (String) document.get("DeliveryMethods");
                                final String ProductName = (String) document.get("ProductName");
                                final Object Price1 = document.get("ProductPrice");
                                final String Price = String.valueOf(Price1);
                                final Object FinalPrice1 = document.get("FinalPrice");
                                final String FinalPrice = String.valueOf(FinalPrice1);
                                final String date = String.valueOf(document.get("OrderPlacedDateTime"));
                                final String Orderid = (String) document.get("OrderId");
                                final String image3 = (String) document.get("ProductImage");

                                Model m = new Model();
                                m.setName(ProductName);
                                m.setPrice(Price);
                                m.setDate(date);
                                m.setOrderid(Orderid);
                                m.setimage3(image3);
                                m.setFinalPrice(FinalPrice);
                                m.setDeliveryMethods(DeliveryMethod);
                                ls_data.add(m);
                            }
                        }
                        try {
                            adapter = new CustomAdapterOrders(getActivity(), ls_data, getActivity());
                        } catch (Exception ex) {
                            Log.e("Error", "Dashboard : " + ex);
                        }
                        listView.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                        swipeLayout.setRefreshing(false);
                        listView.setVisibility(View.VISIBLE);
                        pd.dismiss();
                    } else {
                        pd.dismiss();
                        Toast.makeText(getActivity(), "No open orders yet", Toast.LENGTH_SHORT).show();
                        listView.setVisibility(View.GONE);
                        swipeLayout.setRefreshing(false);
                    }
                }
            });
}

关键修正点

  1. 正确构造了上一年的起始时间(1月1日0点)和结束时间(12月31日23:59:59)
  2. 用whereGreaterThanOrEqualTo和whereLessThanOrEqualTo替换了错误的whereEqualTo,确保能匹配到整个上一年的所有订单
  3. 保留了你原有的数据解析和UI更新逻辑,只修改了日期处理和查询条件部分

这样修改后,日志会输出正确的上一年起止时间,也能查询到对应年份的所有订单了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:29:45