问题
I am working on a news app and I get the date and time from the json response in this pattern (2017-09-23T14:22:28Z).
How can I convert this date and time into something like that (5 seconds ago, 10 minutes ago, 3 hours ago, etc)? And after 24 hours past, it should then display the normal date of that particular news headline (2017-09-23).
回答1:
You can use this code which I have implemented in my chatting app.
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";
}
}
}
There as lot's of 3rd party libraries but you can also refer: https://github.com/curioustechizen/android-ago
回答2:
You may consider using JodaTime Library to manage all Date, Time and Calendar! Here is some code from 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);
}
Check the library Android Specific or Java Specific and its documentation HERE
回答3:
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)
回答4:
Joda-Time is pretty nice for this.
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 Create Method
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;
}
and you can call this Method
System.out.println(convertDate("2017-09-21T14:22:28Z"));
来源:https://stackoverflow.com/questions/46384332/date-and-time-conversion