Wie man Zeit findet ist heute oder gestern in Android

87

Ich entwickle eine Anwendung zum Senden von SMS. Ich speichere die aktuelle Uhrzeit und zeige sie auf der Seite mit dem gesendeten Verlauf an, indem ich die Uhrzeit aus der Datenbank abrufe. Auf der Seite mit dem gesendeten Verlauf möchte ich die Zeit anzeigen, zu der die Nachricht gesendet wurde. Hier möchte ich überprüfen, ob die Nachricht heute oder gestern oder gestern zuvor so gesendet wurde. Wenn die Nachricht gestern gesendet wurde, bedeutet dies, dass ich "Gestern 20:00" so anzeigen muss, und sogar die Nachricht, die gestern gesendet wurde, bedeutet "Montag 20:00". Ich weiß nicht, wie es gemacht werden muss. Bitte helfen Sie mir, wenn jemand weiß.

Manikandan
quelle
Bitte zeigen Sie Ihren Code an, den Sie getan haben ...
Goofy
@Keyser Kannst du mir sagen, wie es geht?
Manikandan
2
Da Sie noch keinen Code ausprobiert haben, wissen Sie nicht, welche Hilfe Sie benötigen. Eine Frage zu stellen ist verfrüht. Warten Sie, bis Sie sehen, was Ihnen Probleme bereitet.
David Schwartz
Wann immer Sie Daten aus der Datenbank
abrufen
@ user1498488 Finden Sie einfach einige Tutorials zur Java-Datums- / Zeitbehandlung.
Keyser

Antworten:

50

Sie können dies einfach mit der android.text.format.DateFormat-Klasse tun. Versuchen Sie so etwas.

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

Weitere Informationen finden Sie unter http://developer.android.com/reference/java/text/DateFormat.html .

Sudhanshu Gupta
quelle
21
Bist du sicher, dass es richtig ist? Sie vergleichen nur Daten, was ist mit Jahr und Monat? Heute ist der 20.11.2014, aber Ihr Code zeigt "Heute" für den 20.10.2010
Daryn
3
Diese Antwort ist nicht korrekt. Gemäß Dokumentation ist Calendar.DATE ein Synonym für DAY_OF_MONTH. Daher vergleichen Sie weder das Jahr noch den Monat.
Joao Sousa
Ja, das ist nicht richtig. (Calendar.DATE) == smsTime.get (Calendar.DATE) stimmt nur mit Datum überein, nicht mit Monat und Jahr. es gibt wahr für 01.01.2012 und 01.01.2017
Anjum
1
Für "Heute" -Text ist diese Lösung immer korrekt, für "Gestern" -Text jedoch nicht am ersten Tag des Monats. Die Methode get (Calendar.DATE) gibt den Tag des Monats zurück und zum Beispiel 1 - 31 = -30 statt 1, was "gestern" angezeigt werden soll - da der 31. Dezember der vorherige Tag des 1. Januar ist.
Lukjar
Das "Heute" und "Gestern" muss den Monat und das Jahr in den Scheck
einbeziehen
242

Verwenden Sie die Android-Utils-Bibliothek, um zu überprüfen, ob das Datum heute ist

DateUtils.isToday(long timeInMilliseconds)

Diese utils-Klasse bietet auch lesbare Zeichenfolgen für relative Zeiten. Zum Beispiel,

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

Es gibt verschiedene Parameter, mit denen Sie spielen können, um zu definieren, wie genau die Zeitspanne sein soll

Siehe DateUtils

Maragues
quelle
5
DateUtils.isToday (myDate.getTime ()) funktioniert einwandfrei, danke!
Loenix
4
Verbraucht dies nur die lokale Zeit (nicht UTC) oder nur UTC-Zeitstempel?
Matthias
5
DateUtils.isToday(long millis)funktioniert wie von @Maragues beschrieben, aber beachten Sie, dass Sie beim Ausführen Ihrer Tests eine RuntimeException erhalten, wenn Sie diese Methode in einem Code verwenden, den Sie einem Komponententest unterziehen möchten (z. B. einem ViewModel oder einem Presenter). Dies liegt daran, dass die für Unit-Tests verwendete Datei android.jar keinen Code enthält. Für weitere Informationen Link
Kaskasi
78

Wie bereits erwähnt, DateUtils.isToday(d.getTime())wird festgestellt, ob Date des heute ist. Einige Antworten hier beantworten jedoch nicht, wie festgestellt werden kann, ob ein Datum gestern war. Sie können dies auch einfach tun mit DateUtils:

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

Anschließend können Sie auch feststellen, ob ein Datum morgen ist:

public static boolean isTomorrow(Date d) {
    return DateUtils.isToday(d.getTime() - DateUtils.DAY_IN_MILLIS);
}
thebaer
quelle
Dies sollte die akzeptierte Antwort sein. Einfach zu lesen und effektiv. Die einzige Möglichkeit, es noch effektiver zu machen, besteht darin, die Methoden für einen Millis-Zeitstempel zu schreiben, damit Sie ihn mit Kalender, Datum oder einer beliebigen Klasse verwenden können.
Joe1806772
Das ist toll. Aber aus irgendeinem seltsamen Grund kann ich dies nicht als Erweiterungsfunktion in Kotlin verwenden, wie:fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
Saifur Rahman Mohsin
Ich denke, dies ist die beste Lösung in buchstäblich zwei Codezeilen, mit denen die Arbeit erledigt wird
Amir Dora.
22

Für heute können Sie DateUtils.isTodayvon Android API verwenden .

Für gestern können Sie diesen Code verwenden:

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);
}
lujop
quelle
@lujpo Perfektion!
Swooby
Der obige Code mit now.get (Calendar.MONTH) scheint den Vormonat zurückzugeben!?
Tina
@ Tina sollte es nur am ersten Tag des Monats passieren
Lujop
9

Sie können dies versuchen:

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

Wenn Ihre API-Stufe 26 oder höher ist, verwenden Sie besser die LocalDate-Klasse:

fun isToday(whenInMillis: Long): Boolean {
    return LocalDate.now().compareTo(LocalDate(whenInMillis)) == 0
}

fun isTomorrow(whenInMillis: Long): Boolean {
    return LocalDate.now().plusDays(1).compareTo(LocalDate(whenInMillis)) == 0
}

fun isYesterday(whenInMillis: Long): Boolean {
    return LocalDate.now().minusDays(1).compareTo(LocalDate(whenInMillis)) == 0
}

Wenn Ihre App eine niedrigere API-Ebene hat, verwenden Sie

fun isToday(whenInMillis: Long): Boolean {
    return DateUtils.isToday(whenInMillis)
}

fun isTomorrow(whenInMillis: Long): Boolean {
    return DateUtils.isToday(whenInMillis - DateUtils.DAY_IN_MILLIS)
}

fun isYesterday(whenInMillis: Long): Boolean {
    return DateUtils.isToday(whenInMillis + DateUtils.DAY_IN_MILLIS)
} 
Константин Семочкин
quelle
5

KEINE Bibliotheken verwendet


Gestern

Heute

Morgen

Dieses Jahr

Jedes Jahr

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

Ein anderer Weg, es zu tun. In Kotlin mit empfohlener lib ThreeTen

  1. Fügen Sie ThreeTen hinzu

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Fügen Sie Kotlin-Erweiterungen hinzu.

    fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L))
    
    fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())
    
PsychedelicSubstance
quelle
Dies sollte der richtige Weg sein. Benutzerdefiniertes Parsen ist einfach schlecht.
XY
4

Kotlin

@Choletski Lösung aber mit Sekunden und in Kotlin

 fun getMyPrettyDate(neededTimeMilis: Long): String? {
        val nowTime = Calendar.getInstance()
        val neededTime = Calendar.getInstance()
        neededTime.timeInMillis = neededTimeMilis
        return if (neededTime[Calendar.YEAR] == nowTime[Calendar.YEAR]) {
            if (neededTime[Calendar.MONTH] == nowTime[Calendar.MONTH]) {
                if (neededTime[Calendar.DATE] - nowTime[Calendar.DATE] == 1) {
                    //here return like "Tomorrow at 12:00"
                    "Tomorrow at " + DateFormat.format("HH:mm:ss", neededTime)
                } else if (nowTime[Calendar.DATE] == neededTime[Calendar.DATE]) {
                    //here return like "Today at 12:00"
                    "Today at " + DateFormat.format("HH:mm:ss", neededTime)
                } else if (nowTime[Calendar.DATE] - neededTime[Calendar.DATE] == 1) {
                    //here return like "Yesterday at 12:00"
                    "Yesterday at " + DateFormat.format("HH:mm:ss", neededTime)
                } else {
                    //here return like "May 31, 12:00"
                    DateFormat.format("MMMM d, HH:mm:ss", neededTime).toString()
                }
            } else {
                //here return like "May 31, 12:00"
                DateFormat.format("MMMM d, HH:mm:ss", neededTime).toString()
            }
        } else {
            //here return like "May 31 2010, 12:00" - it's a different year we need to show it
            DateFormat.format("MMMM dd yyyy, HH:mm:ss", neededTime).toString()
        }
    }

Sie können hier übergeben date.getTime(), um Ausgaben wie zu erhalten

Today at 18:34:45
Yesterday at 12:30:00
Tomorrow at 09:04:05
Gastón Saillén
quelle
2

Dies ist eine Methode, um Werte wie Heute, Gestern und Datum wie die Whtsapp-App abzurufen

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

Verwenden Sie diese Methode nur Millisekunden wie

 getSmsTodayYestFromMilli(Long.parseLong("1485236534000"));
Rjz Satvara
quelle
Haben Sie diesen Code auf Ihrer Seite oder eine Referenz getestet?
androidXP
1
    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";
Raluca Lucaci
quelle
0

Ich kann Ihnen eine Sache vorschlagen. Wenn Sie die SMS senden, speichern Sie die Details in einer Datenbank, damit Sie das Datum und die Uhrzeit, zu der die SMS gesendet wurde, auf der Verlaufsseite anzeigen können.

Doof
quelle
Ja, ich speichere die Zeit in der Datenbank. Aber ich muss überprüfen, ob die gespeicherte Zeit heute oder gestern oder gestern so ist.
Manikandan
Wenn du die Zeit speicherst, warum kannst du dann nicht auch das Datum speichern?
Goofy
Ja, ich kann, aber ich muss so "Heute 8:00" in der Textansicht zeigen
Manikandan
Sie können das tun ... holen Sie sich das Datum aus der Datenbank und vergleichen Sie es mit dem heutigen Datum. Wenn es übereinstimmt, zeigen Sie eine Textansicht als "Heute" an, wenn es das aktuelle Datum ist - revious date, dann zeigen Sie "Yesterday"
Goofy
0

DateUtils.isToday()sollte als veraltet betrachtet werden, da android.text.format.Timees jetzt veraltet ist. Bis sie den Quellcode für isToday aktualisieren, gibt es hier keine Lösung, die heute, gestern erkennt, Verschiebungen zur / von der Sommerzeit verarbeitet und keinen veralteten Code verwendet. Hier ist es in Kotlin, wobei ein todayFeld verwendet wird, das regelmäßig auf dem neuesten Stand gehalten werden muss (z. B. onResumeusw.):

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

Ich legte https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729 , go Abstimmung darüber

androidguy
quelle
0

Dies ist der Code, mit dem ich vorerst gelandet bin:

import android.text.format.DateFormat

fun java.util.Date.asPrettyTime(context: Context): String {
    val nowTime = Calendar.getInstance()

    val dateTime = Calendar.getInstance().also { calendar ->
        calendar.timeInMillis = this.time
    }

    if (dateTime[Calendar.YEAR] != nowTime[Calendar.YEAR]) { // different year
        return DateFormat.format("MM.dd.yyyy.  ·  HH:mm", dateTime).toString()
    }

    if (dateTime[Calendar.MONTH] != nowTime[Calendar.MONTH]) { // different month
        return DateFormat.format("MM.dd.  ·  HH:mm", dateTime).toString()
    }

    return when {
        nowTime[Calendar.DATE] == dateTime[Calendar.DATE] -> { // today
            "${context.getString(R.string.today)}  ·  ${DateFormat.format("HH:mm", dateTime)}"
        }
        nowTime[Calendar.DATE] - dateTime[Calendar.DATE] == 1 -> { // yesterday
            "${context.getString(R.string.yesterday)}  ·  ${DateFormat.format("HH:mm", dateTime)}"
        }
        nowTime[Calendar.DATE] - dateTime[Calendar.DATE] == -1 -> { // tomorrow
            "${context.getString(R.string.tomorrow)}  ·  ${DateFormat.format("HH:mm", dateTime)}"
        }
        else -> { // other date this month
            DateFormat.format("MM.dd.  ·  HH:mm", dateTime).toString()
        }
    }
}
EpicPandaForce
quelle
0

Hier ist eine einfache Lösung, die ich verwende:

public static boolean isTomorrow(Calendar c) {
    Calendar tomorrow = Calendar.getInstance();
    tomorrow.add(Calendar.DATE,1);
    return (tomorrow.get(Calendar.YEAR) == c.get(Calendar.YEAR)) && (tomorrow.get(Calendar.DAY_OF_YEAR) == (c.get(Calendar.DAY_OF_YEAR)));
}

public static boolean isToday(Calendar c) {
    Calendar today = Calendar.getInstance();
    return (today.get(Calendar.YEAR) == c.get(Calendar.YEAR)) && (today.get(Calendar.DAY_OF_YEAR) == c.get(Calendar.DAY_OF_YEAR));
}

Dies deckt alle Randfälle ab, die auftreten können.

Aman Raj Sundram
quelle
-1

Arbeiten Sie ohne Bibliothek und einfachen Code an jedem Kotlin-Projekt

//Simple date format of the day
val sdfDate = SimpleDateFormat("dd/MM/yyyy")

//Create this 2 extensions of Date
fun Date.isToday() = sdfDate.format(this) == sdfDate.format(Date())
fun Date.isYesterday() =
    sdfDate.format(this) == sdfDate.format(Calendar.getInstance().apply { 
          add(Calendar.DAY_OF_MONTH, -1) }.time)
 
    
//And after everwhere in your code you can do
if(myDate.isToday()){
   ...
}
else if(myDate.isYesterday()) {
...
}
Anthone
quelle
Die bereitgestellte Antwort wurde zur Überprüfung als Beitrag von geringer Qualität gekennzeichnet. Hier sind einige Richtlinien für Wie schreibe ich eine gute Antwort? . Diese Antwort könnte von einer Erklärung profitieren. Nur-Code-Antworten gelten nicht als "gute" Antworten. Aus der Überprüfung .
Trenton McKinney