我正在处理一个新闻应用程序,我从这个模式(2017-09-23T14:22:28Z)
中获取json响应的日期和时间。
如何将此日期和时间转换为类似的内容(5秒前,10分钟前,3小时前等)? 过了24小时后,它应显示该特定新闻标题的正常日期(2017-09-23)。
答案 0 :(得分:0)
您可以使用我在聊天应用中实现的代码。
public class Utils
{
private static final int SECOND_MILLIS = 1000;
private static final int MINUTE_MILLIS = 60 * SECOND_MILLIS;
private static final int HOUR_MILLIS = 60 * MINUTE_MILLIS;
private static final int DAY_MILLIS = 24 * HOUR_MILLIS;
public static String getTimeAgo(long time, Context ctx) {
if (time < 1000000000000L) {
// if timestamp given in seconds, convert to millis
time *= 1000;
}
long now = getCurrentTime(ctx);
if (time > now || time <= 0) {
return null;
}
// TODO: localize
final long diff = now - time;
if (diff < MINUTE_MILLIS) {
return "just now";
} else if (diff < 2 * MINUTE_MILLIS) {
return "a minute ago";
} else if (diff < 50 * MINUTE_MILLIS) {
return diff / MINUTE_MILLIS + " minutes ago";
} else if (diff < 90 * MINUTE_MILLIS) {
return "an hour ago";
} else if (diff < 24 * HOUR_MILLIS) {
return diff / HOUR_MILLIS + " hours ago";
} else if (diff < 48 * HOUR_MILLIS) {
return "yesterday";
} else {
return diff / DAY_MILLIS + " days ago";
}
}
}
有很多第三方图书馆,但您也可以参考:https://github.com/curioustechizen/android-ago
答案 1 :(得分:0)
您可以考虑使用JodaTime Library来管理所有日期,时间和日历! 以下是Joda Time的一些代码。
public boolean isAfterPayDay(DateTime datetime) {
if (datetime.getMonthOfYear() == 2) { // February is month 2!!
return datetime.getDayOfMonth() > 26;
}
return datetime.getDayOfMonth() > 28;
}
public Days daysToNewYear(LocalDate fromDate) {
LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
return Days.daysBetween(fromDate, newYear);
}
public boolean isRentalOverdue(DateTime datetimeRented) {
Period rentalPeriod = new Period().withDays(2).withHours(12);
return datetimeRented.plus(rentalPeriod).isBeforeNow();
}
public String getBirthMonthText(LocalDate dateOfBirth) {
return dateOfBirth.monthOfYear().getAsText(Locale.ENGLISH);
}
检查图书馆Android Specific或Java Specific及其文档HERE
答案 2 :(得分:0)
SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");
Date stringDate = simpledateformat.parse(aDate, 0);
DateUtils.getRelativeDateTimeString( this,d.getTime(), DateUtils.MINUTE_IN_MILLIS)
答案 3 :(得分:0)
Joda-Time非常好。
compile 'joda-time:joda-time:2.9.9'
String dateTime = "2017-09-21T14:22:28Z";
DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime myBirthDate = format.parseDateTime(dateTime);
DateTime now = new DateTime();
Period period = new Period(myBirthDate, now);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendSeconds().appendSuffix(" Sekonds ago\n")
.appendMinutes().appendSuffix(" Minutes ago\n")
.appendHours().appendSuffix(" Hours ago\n")
.appendDays().appendSuffix(" Days ago\n")
.appendWeeks().appendSuffix(" Weeks ago\n")
.appendMonths().appendSuffix(" Months ago\n")
.appendYears().appendSuffix(" Years ago\n")
.printZeroNever()
.toFormatter();
if (period.getDays()<1) {
String result = formatter.print(period);
System.out.println(result);
} else {
DateTimeFormatter format24hMore = DateTimeFormat.forPattern("yyyy-MM-dd");
String result = format24hMore.print(myBirthDate);
System.out.println(result);
}
EDIT 创建方法
public String convertDate(String date) {
String result = "";
DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime from = format.parseDateTime(date);
DateTime now = new DateTime();
Period period = new Period(from, now);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendSeconds().appendSuffix(" Sekonds ago\n")
.appendMinutes().appendSuffix(" Minutes ago\n")
.appendHours().appendSuffix(" Hours ago\n")
.appendDays().appendSuffix(" Days ago\n")
.appendWeeks().appendSuffix(" Weeks ago\n")
.appendMonths().appendSuffix(" Months ago\n")
.appendYears().appendSuffix(" Years ago\n")
.printZeroNever()
.toFormatter();
if (period.getDays()<1) {
result = formatter.print(period);
} else {
DateTimeFormatter format24hMore = DateTimeFormat.forPattern("yyyy-MM-dd");
result = format24hMore.print(from);
}
return result;
}
您可以调用此方法
System.out.println(convertDate("2017-09-21T14:22:28Z"));