获取上一年年份时出错,无法正确筛选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>() { // ... 后续逻辑省略 }); }
错误原因分析
- 日期构造错误:
new Date(calendar.get(Calendar.YEAR))完全用错了Date的构造方法——Date(long date)接收的是从1970年1月1日0点开始的毫秒数,而calendar.get(Calendar.YEAR)返回的是年份数值(比如2017)。把2017作为毫秒数传入,得到的自然是1970年1月1日加上2017毫秒的结果,也就是日志里的错误时间。 - 查询逻辑错误:就算你构造出正确的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日0点)和结束时间(12月31日23:59:59)
- 用
whereGreaterThanOrEqualTo和whereLessThanOrEqualTo替换了错误的whereEqualTo,确保能匹配到整个上一年的所有订单 - 保留了你原有的数据解析和UI更新逻辑,只修改了日期处理和查询条件部分
这样修改后,日志会输出正确的上一年起止时间,也能查询到对应年份的所有订单了。
内容的提问来源于stack exchange,提问作者lasya valiveti
相关产品推荐
相关产品推荐

