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.
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.
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
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);
}
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);
}
Vous pouvez essayer ceci:
Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
//format one way
} else {
//format in other way
}
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();
}
}
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";
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"));
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
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.
Une autre façon de le faire. Dans kotlin avec la bibliothèque recommandée ThreeTen
Ajouter ThreeTen
implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
Ajouter des extensions de kotlin.
fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L))
fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())