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ß.
87
Antworten:
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 .
quelle
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
quelle
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 LinkWie bereits erwähnt,
DateUtils.isToday(d.getTime())
wird festgestellt, obDate d
es heute ist. Einige Antworten hier beantworten jedoch nicht, wie festgestellt werden kann, ob ein Datum gestern war. Sie können dies auch einfach tun mitDateUtils
: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); }
quelle
fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
Für heute können Sie
DateUtils.isToday
von 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); }
quelle
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 }
quelle
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
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(); } }
quelle
Ein anderer Weg, es zu tun. In Kotlin mit empfohlener lib ThreeTen
Fügen Sie ThreeTen hinzu
implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
Fügen Sie Kotlin-Erweiterungen hinzu.
fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L)) fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())
quelle
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 erhaltenToday at 18:34:45 Yesterday at 12:30:00 Tomorrow at 09:04:05
quelle
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"));
quelle
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";
quelle
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.
quelle
DateUtils.isToday()
sollte als veraltet betrachtet werden, daandroid.text.format.Time
es 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 eintoday
Feld verwendet wird, das regelmäßig auf dem neuesten Stand gehalten werden muss (z. B.onResume
usw.):@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
quelle
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() } } }
quelle
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.
quelle
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()) { ... }
quelle