【问题标题】:error in getting previous year from current year从当年获取上一年的错误
【发布时间】:2018-05-21 10:55:35
【问题描述】:

我正在尝试从当前年份获取上一年。

 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>() {
                        @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(String.valueOf(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.setAdapter(adapter);
                                listView.setVisibility(View.GONE);
                                //adapter.notifyDataSetChanged();
                                swipeLayout.setRefreshing(false);
                            }

                        }
                    });
        }

它应该返回我 2017 作为结果。但是它返回的错误输出如下

一个 E/Filter  by:: 去年 05-21 10:43:44.676 11437-11437/com.bodaty.samyata.samyata E/去年:1 月 1 日星期四 00:00:02 GMT+00:00 1970

应显示 2017 年的所有订单 提前谢谢

【问题讨论】:

  • 看来问题不仅在于正确的年份,还在于如何编写包含给定年份中所有日期值的查询。我认为whereEqualTo 做不到。我不知道该怎么做。我希望有人这样做。

标签: android firebase google-cloud-firestore


【解决方案1】:

这就是答案。只需要改一行

 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));

        Date lastyear = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(lastyear.getTime());
        calendar.add(Calendar.YEAR ,-1);
        lastyear = new Date(calendar.getTime().getTime());
        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>() {
                    @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(String.valueOf(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.setAdapter(adapter);
                            listView.setVisibility(View.GONE);
                            //adapter.notifyDataSetChanged();
                            swipeLayout.setRefreshing(false);
                        }

                    }
                });

【讨论】:

  • 你没有显示你改变了哪一行,或者解释了你改变它的为什么,这使得这作为 IMO 的答案相当无益。此外,使用new Date(calendar.getTime().getTime()) 比仅调用calendar.getTime() 要冗长得多,但应该会达到相同的结果......而且你在我的回答中声称这无论如何都不起作用。
【解决方案2】:

请更改以下代码:

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));

到:

 Calendar now= Calendar.getInstance();// this has all the current time info including year
    now.add(Calendar.YEAR, -1); //now is 1 year less.

    Date lastyear= now.getTime();
    Log.e("lastyear", String.valueOf(lastyear));

【讨论】:

  • 那现在根本没有lastyear 变量声明,这意味着稍后尝试使用它的代码将失败。目前尚不清楚您希望 whereEqualTo 的参数现在是什么。
  • 是的,主要问题是存在这个 sn-p,一旦日历年被减去 1 并且该值被正确检索。一个可以做Date lastyear= new Date(now.get(Calendar.YEAR));我会编辑我的答案
  • 不,如果你这样做 Date lastyear= new Date(now.get(Calendar.YEAR)); 你仍然会在 1970 年得到一个值 - 请参阅我的答案。从根本上说,您为什么希望您的代码给出与原始代码不同的结果。
  • 哦,我明白你在说什么。我确实错了。感谢您指出。但是我发现使用Date lastyear = now.getTime(); 可以解决问题。完成并测试。我将再次编辑我的答案。请撤消反对票。由于代码在此编辑后有效。我已经测试过了。
  • 我已经删除了反对票,但您还没有解释为什么原始代码被破坏或为什么您的代码可以工作。 只有 now.getTime() 调用与此处相关,IMO。 (原始代码在调用setTimeInMilliseconds 方面毫无意义,但这实际上不是问题。)
【解决方案3】:
   Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.YEAR,-1);
    String year = new SimpleDateFormat("yyyy", Locale.US).format(calendar.getTime());
    Toast.makeText(this, ""+ year, Toast.LENGTH_SHORT).show();

试试这个

【讨论】:

【解决方案4】:

这是最初的问题:

lastyear = new Date(calendar.get(Calendar.YEAR));

这将创建一个 Date 对象,其“自 Unix 纪元以来的毫秒时间”等于 calendar 的年份。因此,您正在创建一个Date,即 Unix 纪元后 2017 毫秒:1970-01-01T00:00:02.017Z,换句话说。这解释了您的日志消息。

如果您可以可能避免使用 java.util.Datejava.util.Calendar 类,那么这样做是个好主意(改用 java.time)...但如果您有 使用它们,你想要的

lastyear = calendar.getTime();

这是获取Date对象对应Calendar对象的方法。

但是,您仍然在这样的查询中使用它:

.whereEqualTo("OrderPlacedDateTime", lastyear)

这将查找具有该确切时间戳的文档,这可能不是您想要的。如果你想要那一年的所有订单,你可能想要找到年份(例如 2017 年),然后创建两个 Date 值,一个代表 2017 年初,一个代表 2018 年初,然后使用:

.whereGreaterThanOrEqualTo("OrderPlacedDateTime", startInclusive)
.whereLessThan("OrderPlacedDateTime", endExclusive)

【讨论】:

  • 它不起作用,先生。你能详细重写代码吗
  • @lasyavaliveti:不,因为我不知道哪里出了问题。假设您希望 lastyear 成为 Date 值,您应该只需要更改该单行。你是什​​么意思“它没有工作”?请非常具体。
  • 我想.whereEqualTo("OrderPlacedDateTime", lastyear) 会为您提供指定日期和时间的订单。并非所有订单都是 2017 年。
  • @OleV.V.:好点——尽管 OP 然后自己给出了一个答案,但仍然使用它。会在我的回答中注明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2011-05-25
  • 2016-10-07
  • 2016-02-12
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多