Iam разрабатывает приложение для отправки смс. Iam сохраняя текущее время и отображая на отправленной странице истории, получая время из базы данных. На странице отправленной истории я хочу отобразить время отправки сообщения. Здесь я хочу проверить, что сообщение было отправлено сегодня или вчера или вчера раньше. Если сообщение было отправлено вчера, значит, мне нужно отобразить "Вчера 20:00", и даже сообщение было отправлено вчера, прежде чем "Понедельник 20:00". Я не знаю, как это должно быть сделано. Пожалуйста, помогите мне, если кто-нибудь знает.
Как найти время сегодня или вчера в Android
Ответ 1
Вы можете легко это сделать, используя класс android.text.format.DateFormat. Попробуйте что-то вроде этого.
public String getFormattedDate(Context context, long smsTimeInMilis) {
Calendar smsTime = Calendar.getInstance();
smsTime.setTimeInMillis(smsTimeInMilis);
Calendar now = Calendar.getInstance();
final String timeFormatString = "h:mm aa";
final String dateTimeFormatString = "EEEE, MMMM d, h:mm aa";
final long HOURS = 60 * 60 * 60;
if (now.get(Calendar.DATE) == smsTime.get(Calendar.DATE) ) {
return "Today " + DateFormat.format(timeFormatString, smsTime);
} else if (now.get(Calendar.DATE) - smsTime.get(Calendar.DATE) == 1 ){
return "Yesterday " + DateFormat.format(timeFormatString, smsTime);
} else if (now.get(Calendar.YEAR) == smsTime.get(Calendar.YEAR)) {
return DateFormat.format(dateTimeFormatString, smsTime).toString();
} else {
return DateFormat.format("MMMM dd yyyy, h:mm aa", smsTime).toString();
}
}
Проверьте http://developer.android.com/reference/java/text/DateFormat.html для дальнейшего понимания.
Ответ 2
Чтобы проверить, установлена ли дата сегодня, используйте утилиту Android utils library
DateUtils.isToday(long timeInMilliseconds)
Этот класс utils также предлагает читаемые пользователем строки для относительных времен. Например,
DateUtils.getRelativeTimeSpanString(long timeInMilliseconds) -> "42 minutes ago"
С помощью нескольких параметров вы можете определить, насколько точным должен быть временной интервал
См. DateUtils
Ответ 3
На сегодняшний день вы можете использовать DateUtils.isToday
из API android.
За вчерашний день вы можете использовать этот код:
public static boolean isYesterday(long date) {
Calendar now = Calendar.getInstance();
Calendar cdate = Calendar.getInstance();
cdate.setTimeInMillis(date);
now.add(Calendar.DATE,-1);
return now.get(Calendar.YEAR) == cdate.get(Calendar.YEAR)
&& now.get(Calendar.MONTH) == cdate.get(Calendar.MONTH)
&& now.get(Calendar.DATE) == cdate.get(Calendar.DATE);
}
Ответ 4
Как уже упоминалось, DateUtils.isToday(d.getTime())
будет работать для определения того, является ли Date d
сегодня. Но некоторые ответы здесь фактически не отвечают, как определить, была ли дата вчера. Вы также можете легко сделать это с помощью DateUtils
:
public static boolean isYesterday(Date d) {
return DateUtils.isToday(d.getTime() + DateUtils.DAY_IN_MILLIS);
}
После этого вы также можете определить, была ли дата завтра:
public static boolean isTomorrow(Date d) {
return DateUtils.isToday(d.getTime() - DateUtils.DAY_IN_MILLIS);
}
Ответ 5
Вы можете попробовать следующее:
Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
//format one way
} else {
//format in other way
}
Ответ 6
Calendar now = Calendar.getInstance();
long secs = (dateToCompare - now.getTime().getTime()) / 1000;
if (secs > 0) {
int hours = (int) secs / 3600;
if (hours <= 24) {
return today + "," + "a formatted day or empty";
} else if (hours <= 48) {
return yesterday + "," + "a formatted day or empty";
}
} else {
int hours = (int) Math.abs(secs) / 3600;
if (hours <= 24) {
return tommorow + "," + "a formatted day or empty";
}
}
return "a formatted day or empty";
Ответ 7
Я могу предложить вам одну вещь. Когда вы отправляете sms, храните данные в базе данных, чтобы вы могли отображать дату и время отправки sms на странице истории.
Ответ 8
DateUtils.isToday()
следует считать устаревшим, поскольку android.text.format.Time
теперь устарел.
Пока они не обновляют исходный код isToday, здесь нет решения, которое обнаруживает сегодня, вчера, обрабатывает сдвиги в/от летнего времени и не использует устаревший код. Здесь он находится в Kotlin, используя поле today
, которое должно периодически обновляться (например, onResume
и т.д.):
@JvmStatic
fun dateString(ctx: Context, epochTime: Long): String {
val epochMS = 1000*epochTime
val cal = Calendar.getInstance()
cal.timeInMillis = epochMS
val yearDiff = cal.get(Calendar.YEAR) - today.get(Calendar.YEAR)
if (yearDiff == 0) {
if (cal.get(Calendar.DAY_OF_YEAR) >= today.get(Calendar.DAY_OF_YEAR))
return ctx.getString(R.string.today)
}
cal.add(Calendar.DATE, 1)
if (cal.get(Calendar.YEAR) == today.get(Calendar.YEAR)) {
if (cal.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR))
return ctx.getString(R.string.yesterday)
}
val flags = if (yearDiff == 0) DateUtils.FORMAT_ABBREV_MONTH else DateUtils.FORMAT_NUMERIC_DATE
return DateUtils.formatDateTime(ctx, epochMS, flags)
}
Я подал https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729, проголосуйте за него
Ответ 9
Это метод получения значений, таких как Today, Yesterday и Date, как приложение Whtsapp,
public String getSmsTodayYestFromMilli(long msgTimeMillis) {
Calendar messageTime = Calendar.getInstance();
messageTime.setTimeInMillis(msgTimeMillis);
// get Currunt time
Calendar now = Calendar.getInstance();
final String strTimeFormate = "h:mm aa";
final String strDateFormate = "dd/MM/yyyy h:mm aa";
if (now.get(Calendar.DATE) == messageTime.get(Calendar.DATE)
&&
((now.get(Calendar.MONTH) == messageTime.get(Calendar.MONTH)))
&&
((now.get(Calendar.YEAR) == messageTime.get(Calendar.YEAR)))
) {
return "today at " + DateFormat.format(strTimeFormate, messageTime);
} else if (
((now.get(Calendar.DATE) - messageTime.get(Calendar.DATE)) == 1)
&&
((now.get(Calendar.MONTH) == messageTime.get(Calendar.MONTH)))
&&
((now.get(Calendar.YEAR) == messageTime.get(Calendar.YEAR)))
) {
return "yesterday at " + DateFormat.format(strTimeFormate, messageTime);
} else {
return "date : " + DateFormat.format(strDateFormate, messageTime);
}
}
Используйте этот метод, просто пропустите Millisecond как
getSmsTodayYestFromMilli(Long.parseLong("1485236534000"));