web-dev-qa-db-fra.com

Comment trouver le temps est aujourd'hui ou hier dans Android

Je développe une application pour l'envoi de SMS. Iam stocke l'heure actuelle et s'affiche dans la page d'historique envoyée en récupérant l'heure de la base de données. Dans la page d'historique des envois, je souhaite afficher l'heure à laquelle le message a été envoyé. Ici, je veux vérifier que le message a été envoyé aujourd'hui ou hier ou hier auparavant. Si le message a été envoyé hier, cela signifie que je dois afficher "Yesterday 20:00" comme cela et même le message a été envoyé hier avant signifie "Monday 20:00". Je ne sais pas comment cela doit être fait. S'il vous plaît aidez-moi si quelqu'un sait.

55
Manikandan

Vous pouvez le faire facilement en utilisant la classe Android.text.format.DateFormat. Essayez quelque chose comme ça.

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();
    }
}

Vérifiez http://developer.Android.com/reference/Java/text/DateFormat.html pour plus de détails.

35
Sudhanshu Gupta

Pour vérifier si la date est au jour, utilisez la bibliothèque Android utils

DateUtils.isToday(long timeInMilliseconds)

Cette classe propose également des chaînes lisibles par l’homme pour les temps relatifs. Par exemple,

DateUtils.getRelativeTimeSpanString(long timeInMilliseconds) -> "42 minutes ago"

Vous pouvez jouer avec plusieurs paramètres pour définir la précision de la période.

Voir DateUtils

174
Maragues

Comme mentionné précédemment, DateUtils.isToday(d.getTime()) permettra de déterminer si Date d est aujourd'hui. Mais certaines réponses ici ne disent pas comment déterminer si une date était hier. Vous pouvez aussi le faire facilement avec DateUtils:

public static boolean isYesterday(Date d) {
    return DateUtils.isToday(d.getTime() + DateUtils.DAY_IN_MILLIS);
}

Ensuite, vous pouvez également déterminer si une date correspond à demain:

public static boolean isTomorrow(Date d) {
    return DateUtils.isToday(d.getTime() - DateUtils.DAY_IN_MILLIS);
}
35
thebaer

Pour aujourd'hui, vous pouvez utiliser DateUtils.isToday à partir de Android API .

Pour hier, vous pouvez utiliser ce code:

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);
}
21
lujop

Vous pouvez essayer ceci:

Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
  //format one way
} else {
  //format in other way
}
8
Roman Golyshev

AUCUN libs utilisé


Hier

Aujourd'hui  

Demain

Cette année

Toute année

 public static String getMyPrettyDate(long neededTimeMilis) {
    Calendar nowTime = Calendar.getInstance();
    Calendar neededTime = Calendar.getInstance();
    neededTime.setTimeInMillis(neededTimeMilis);

    if ((neededTime.get(Calendar.YEAR) == nowTime.get(Calendar.YEAR))) {

        if ((neededTime.get(Calendar.MONTH) == nowTime.get(Calendar.MONTH))) {

            if (neededTime.get(Calendar.DATE) - nowTime.get(Calendar.DATE) == 1) {
                //here return like "Tomorrow at 12:00"
                return "Tomorrow at " + DateFormat.format("HH:mm", neededTime);

            } else if (nowTime.get(Calendar.DATE) == neededTime.get(Calendar.DATE)) {
                //here return like "Today at 12:00"
                return "Today at " + DateFormat.format("HH:mm", neededTime);

            } else if (nowTime.get(Calendar.DATE) - neededTime.get(Calendar.DATE) == 1) {
                //here return like "Yesterday at 12:00"
                return "Yesterday at " + DateFormat.format("HH:mm", neededTime);

            } else {
                //here return like "May 31, 12:00"
                return DateFormat.format("MMMM d, HH:mm", neededTime).toString();
            }

        } else {
            //here return like "May 31, 12:00"
            return DateFormat.format("MMMM d, HH:mm", neededTime).toString();
        }

    } else {
        //here return like "May 31 2010, 12:00" - it's a different year we need to show it
        return DateFormat.format("MMMM dd yyyy, HH:mm", neededTime).toString();
    }
}
2
Choletski
    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";
1
Raluca Lucaci

Ceci est une méthode pour obtenir des valeurs comme aujourd'hui, hier et Date comme l'application Whtsapp ont

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);
        }
    }

Utilisez cette méthode en passant juste des millisecondes comme  

 getSmsTodayYestFromMilli(Long.parseLong("1485236534000"));
1
Rjz Satvara

DateUtils.isToday() devrait être considéré comme obsolète car Android.text.format.Time est maintenant obsolète. Jusqu'à ce qu'ils mettent à jour le code source pour isToday, il n'y a pas de solution qui détecte aujourd'hui, hier, gère les décalages vers/depuis l'heure d'été et n'utilise pas de code obsolète. Ici, c'est dans Kotlin, en utilisant un champ today qui doit être tenu à jour périodiquement (par exemple, onResume etc.):

@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)
}

J'ai classé https://code.google.com/p/Android/issues/detail?id=227694&thanks=227694&ts=1479155729 , allez voter dessus

0
androidguy

je peux vous suggérer une chose. Lorsque vous envoyez le sms, stockez les détails dans une base de données afin que vous puissiez afficher la date et l'heure auxquelles le sms a été envoyé dans la page d'historique.

0
Goofy

Une autre façon de le faire. Dans kotlin avec la bibliothèque recommandée ThreeTen

  1. Ajouter ThreeTen

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Ajouter des extensions de kotlin.

    fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L))
    
    fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())
    
0
Jack the Ripper