【问题标题】:Display "minutes ago" in android app [duplicate]在android应用程序中显示“几分钟前”[重复]
【发布时间】:2017-08-27 10:33:43
【问题描述】:

我尽力进行研究并寻找教程,但仍然对此感到困惑。我的问题是,我想根据从 json 数据中获取的创建日期和时间显示类似“几分钟前”的内容。

当我从服务器获取日期和时间时,我想在 livestatTimeAgo 文本视图中显示它,但它显示错误,因为 getTimeAgo 方法是长格式的。所以我使用 parseLong 来更改我获取的数据,但仍然出错。有人可以给我提示如何将长数据显示为这样的字符串值。

这是错误日志:

FATAL EXCEPTION: main
Process: com.baracode.eilsan, PID: 898
                                                                 java.lang.NumberFormatException: For input string: "2017-08-25 09:20:54"
                                                                     at java.lang.Long.parseLong(Long.java:443)
                                                                     at java.lang.Long.parseLong(Long.java:485)
                                                                     at com.baracode.eilsan.livestat.adapter.LivestatAdapter.onBindViewHolder(LivestatAdapter.java:49)
                                                                     at com.baracode.eilsan.livestat.adapter.LivestatAdapter.onBindViewHolder(LivestatAdapter.java:29)
                                                                     at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6400)
                                                                     at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6433)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5377)

这是我的代码

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.baracode.eilsan.R;
import com.baracode.eilsan.model.LiveFeed;

import java.text.DateFormat;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

/**
 * Created by kille on 17/7/2017.
 */

public class LivestatAdapter extends RecyclerView.Adapter<LivestatAdapter.MyViewHolder> {
    private final ArrayList<LiveFeed> livestatList;
    private LiveFeed liveFeed;




    public LivestatAdapter(ArrayList<LiveFeed> livestatList) {
        this.livestatList = livestatList;
    }

    @Override
    public LivestatAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_livestat, parent, false);
        return new LivestatAdapter.MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        LiveFeed livestatModel = livestatList.get(position);
        holder.livestatTimeAgo.setText(getTimeAgo(Long.parseLong(livestatModel.createdAt)));
        holder.livestatOrganisationName.setText(livestatModel.beneficiaryName);
        holder.livestatMoneyDonated.setText(livestatModel.amount);
        holder.livestatDonorName.setText(livestatModel.donorName);
    }


    @Override
    public int getItemCount() {
        return livestatList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView livestatTimeAgo, livestatDonorName, livestatOrganisationName, livestatMoneyDonated;

        public MyViewHolder(View view) {
            super(view);
            livestatTimeAgo = view.findViewById(R.id.livestat_time_ago);
            livestatOrganisationName = view.findViewById(R.id.livestat_organisation_name);
            livestatMoneyDonated = view.findViewById(R.id.livestat_money_donated);
            livestatDonorName = view.findViewById(R.id.livestat_donor_name);

        }
    }

//    private String ConvertTime(String time) {
//
//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        SimpleDateFormat format1 = new SimpleDateFormat("hh:mm aa MM-dd");
//        java.util.Date date = null;
//
//        try {
//            date = format.parse(time);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
//
//        String convertedDate = format1.format(date);
//
//        return convertedDate;
//    }

    public static String getTimeAgo(long timestamp) {

        Calendar cal = Calendar.getInstance();
        TimeZone tz = cal.getTimeZone();//get your local time zone.
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm ss");
        sdf.setTimeZone(tz);//set time zone.
        String localTime = sdf.format(new Date(timestamp * 1000));
        Date date = new Date();
        try {
            date = sdf.parse(localTime);//get local date
        } catch (ParseException e) {
            e.printStackTrace();
        }

        if(date == null) {
            return null;
        }

        long time = date.getTime();

        Date curDate = currentDate();
        long now = curDate.getTime();
        if (time > now || time <= 0) {
            return null;
        }

        int timeDIM = getTimeDistanceInMinutes(time);

        String timeAgo = null;

        if (timeDIM == 0) {
            timeAgo = "less than a minute";
        } else if (timeDIM == 1) {
            return "1 minute";
        } else if (timeDIM >= 2 && timeDIM <= 44) {
            timeAgo = timeDIM + " minutes";
        } else if (timeDIM >= 45 && timeDIM <= 89) {
            timeAgo = "about an hour";
        } else if (timeDIM >= 90 && timeDIM <= 1439) {
            timeAgo = "about " + (Math.round(timeDIM / 60)) + " hours";
        } else if (timeDIM >= 1440 && timeDIM <= 2519) {
            timeAgo = "1 day";
        } else if (timeDIM >= 2520 && timeDIM <= 43199) {
            timeAgo = (Math.round(timeDIM / 1440)) + " days";
        } else if (timeDIM >= 43200 && timeDIM <= 86399) {
            timeAgo = "about a month";
        } else if (timeDIM >= 86400 && timeDIM <= 525599) {
            timeAgo = (Math.round(timeDIM / 43200)) + " months";
        } else if (timeDIM >= 525600 && timeDIM <= 655199) {
            timeAgo = "about a year";
        } else if (timeDIM >= 655200 && timeDIM <= 914399) {
            timeAgo = "over a year";
        } else if (timeDIM >= 914400 && timeDIM <= 1051199) {
            timeAgo = "almost 2 years";
        } else {
            timeAgo = "about " + (Math.round(timeDIM / 525600)) + " years";
        }

        return timeAgo + " ago";
    }

    public static Date currentDate() {
        Calendar calendar = Calendar.getInstance();
        return calendar.getTime();
    }

    private static int getTimeDistanceInMinutes(long time) {
        long timeDistance = currentDate().getTime() - time;
        return Math.round((Math.abs(timeDistance) / 1000) / 60);
    }



}

这里是我的直播课..

public class LiveFeed {

    @SerializedName("id")
    public String id = "";

    @SerializedName("ref_id")
    public String refId = "";

    @SerializedName("beneficiary_type")
    public String beneficiaryType = "";

    @SerializedName("beneficiary_name")
    public String beneficiaryName = "";

    @SerializedName("donor_name")
    public String donorName = "";

    @SerializedName("amount")
    public String amount = "";

    @SerializedName("description")
    public String description = "";

    @SerializedName("remark")
    public String remark = "";

    @SerializedName("status")
    public String status = "";

    @SerializedName("created_at")
    public String createdAt = "";


    @SerializedName("updated_at")
    public String updatedAt = "";

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getRefId() {
        return refId;
    }

    public void setRefId(String refId) {
        this.refId = refId;
    }

    public String getBeneficiaryType() {
        return beneficiaryType;
    }

    public void setBeneficiaryType(String beneficiaryType) {
        this.beneficiaryType = beneficiaryType;
    }

    public String getBeneficiaryName() {
        return beneficiaryName;
    }

    public void setBeneficiaryName(String beneficiaryName) {
        this.beneficiaryName = beneficiaryName;
    }

    public String getDonorName() {
        return donorName;
    }

    public void setDonorName(String donorName) {
        this.donorName = donorName;
    }

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(String createdAt) {
        this.createdAt = createdAt;
    }

    public String getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(String updatedAt) {
        this.updatedAt = updatedAt;
    }

}

所以这是我的问题的正确答案..关于如何获得时间的更新代码..对于任何想要参考的人!谢谢

DateFormat getDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String fromDate = getDate.format(Calendar.getInstance().getTime());
String endDate = livestatModel.updatedAt; //here my jsondataName

long diff = 0;
try {
    //Convert to Date
    Date startDate = getDate.parse(fromDate);
    Calendar c1 = Calendar.getInstance();
    //Change to Calendar Date
    c1.setTime(startDate);

    //Convert to Date
    Date endDate2 = getDate.parse(endDate);
    Calendar c2 = Calendar.getInstance();
    //Change to Calendar Date
    c2.setTime(endDate2);

    //get Time in milli seconds
    long ms1 = c1.getTimeInMillis();
    long ms2 = c2.getTimeInMillis();
    //get difference in milli seconds
    diff = ms1 - ms2;

    if (diff < 0) {
        holder.livestatTimeAgo.setText(" 0 day " + " 0 hour " + " 0 minute " + " 0 sec " + "left");
    } else {
        int diffInDays = (int) (diff / (1000 * 60 * 60 * 24));
        int diffInHours = (int) ((diff / (1000 * 60 * 60)) % 24);
        int diffInMinutes = (int) ((diff % (1000 * 60 * 60)) / (1000 * 60));
        int diffInSec = (int) ((diff / 1000) % 60);
        holder.livestatTimeAgo.setText(diffInDays + " days " + diffInHours + " hours " + diffInMinutes + " minutes " + diffInSec + " secs " + "Ago");
    }
}catch (Exception e){}

【问题讨论】:

  • java.lang.NumberFormatException: For input string: "2017-08-25 09:20:54" 你的日期字符串应该代表哪个数字?
  • 我希望它在 textview 先生中代表类似“1 分钟前”的内容。我的字符串格式的 json 日期数据,所以我使用 getTimeAgo 方法()来更改它。但该方法采用长格式。那么现在如何显示呢?我想以字符串格式显示。
  • 我不清楚。您的错误告诉您正在尝试将日期字符串转换为数字。你想得到两个日期之间的差异。你应该用谷歌搜索什么。
  • 我想在显示之前将我当前为字符串数据类型的日期转换为长数据类型...
  • 您无法将 NOT A NUMBER 转换为数字。现在清楚了吗?

标签: android date-difference


【解决方案1】:

首先将您的字符串转换为日历:

 Calendar cal = Calendar.getInstance();
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
 cal.setTime(sdf.parse("2017-08-25 09:20:54"));

然后使用

long time = cal.getTimeInMillis();

这应该是诀窍。

编辑

这是您想要做的一个可能的例子。我不知道计算是否正确但有效。

 try{

 Calendar cal = Calendar.getInstance();
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 cal.setTime(sdf.parse("2017-08-25 09:20:54"));

  Calendar calendar = Calendar.getInstance();
  long now = calendar.getTimeInMillis();
  long time = cal.getTimeInMillis();

  long diff = now - time;

  int seconds = (int) (diff / 1000) % 60 ;
  int minutes = (int) ((diff / (1000*60)) % 60);
  int hours   = (int) ((diff / (1000*60*60)) % 24);
  int days = (int) (diff / (1000*60*60*24));

  System.out.println(time + " " + now);
  System.out.println(hours + " hours ago");
  System.out.println(minutes + " minutes ago");
  System.out.println(seconds + " seconds ago");
  System.out.println(days + " days ago");


}catch(ParseException e){
     System.out.println(e.toString());
}

【讨论】:

  • 我从 json 中获取时间......当我把它放在 setTime() 中时它变成了错误......
  • 查看我的版本以获得答案。这只是一个例子,您必须自己计算。
【解决方案2】:

您在以下行中遇到错误。

holder.livestatTimeAgo.setText(getTimeAgo(Long.parseLong(livestatModel.createdAt)));

由于错误是java.lang.NumberFormatException: For input string: "2017-08-25 09:20:54",这几乎意味着livestatModel.createdAt 成立 2017-08-25 09:20:54 更像是一个字符串值,不能解析为 Long,因为它包含冒号、连字符和空格等语法。

更新

要将您的日期字符串转换为长字符串,您需要使用 SimpleDateFormat 解析 livestatModel.createdAt(就像您在 getTimeAgo 方法中所做的那样,但格式不同)。

以下是实现这一目标的方法。

long createdAtLong = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(livestatModel.createdAt).getTime();

holder.livestatTimeAgo.setText(getTimeAgo(createdAtLong));

【讨论】:

  • 所以先生..如何解决这个问题。我需要获取不带冒号或什么的数据?...这里是我的请求 api...
  • 检查我更新的答案。
  • 谢谢先生...但是我应该在哪里实现这个...我需要创建另一个方法或者只是将 long createdLong 放在 onBindViewHolder 方法下面...
  • 这一行以上应该可以完成这项工作。 holder.livestatTimeAgo.setText(getTimeAgo(createdAtLong));
  • 当我在 onBindViewHolder 下实现它时,它说我需要用 try catch 包围。然后,当我运行该应用程序时,它什么也没显示..但没有错误
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多