Подтвердить что ты не робот

Как найти время сегодня или вчера в Android

Iam разрабатывает приложение для отправки смс. Iam сохраняя текущее время и отображая на отправленной странице истории, получая время из базы данных. На странице отправленной истории я хочу отобразить время отправки сообщения. Здесь я хочу проверить, что сообщение было отправлено сегодня или вчера или вчера раньше. Если сообщение было отправлено вчера, значит, мне нужно отобразить "Вчера 20:00", и даже сообщение было отправлено вчера, прежде чем "Понедельник 20:00". Я не знаю, как это должно быть сделано. Пожалуйста, помогите мне, если кто-нибудь знает.

4b9b3361

Ответ 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"));