如何在机器人中找到时间是今天还是昨天

我正在开发一个发送短信的应用程序。我正在通过从数据库检索时间来存储当前时间并显示在已发送的历史页面中。在已发送的历史页面中,我想显示消息发送的时间。在这里,我想检查的消息已发送今天或昨天或前天这样。如果消息是昨天发送的,那么我需要像这样显示“昨天20:00”,甚至消息是昨天发送的,之前的意思是“星期一20:00”。我不知道该怎么做。如果有人知道,请帮帮我。

80147 次浏览

i can suggest you one thing. When u send the sms store the details into a database so that u can display the date and time on which the sms was sent in the history page.

You can do that easily using android.text.format.DateFormat class. Try something like this.

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

Check http://developer.android.com/reference/java/text/DateFormat.html for further understanding.

To check if date is today, use Android utils library

DateUtils.isToday(long timeInMilliseconds)

This utils class also offers human readable strings for relative times. For example,

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

The are several parameters you can play with to define how precise the time span should be

See DateUtils

    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";

You can try this:

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

For today you can use DateUtils.isToday from android API.

For yesterday you can use that 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);
}

DateUtils.isToday() should be considered deprecated because android.text.format.Time is now deprecated. Until they update the source code for isToday, there is no solution here that detects today, yesterday, handles shifts to/from daylight saving time, and does not use deprecated code. Here it is in Kotlin, using a today field that must be kept up to date periodically (e.g. 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)
}

I filed https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729, go vote on it

This is method for get Values like Today , Yesterday and Date like Whtsapp app have

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

Use this method just pass Millisecond like

 getSmsTodayYestFromMilli(Long.parseLong("1485236534000"));

As mentioned, DateUtils.isToday(d.getTime()) will work for determining if Date d is today. But some responses here don't actually answer how to determine if a date was yesterday. You can also do that easily with DateUtils:

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

Following that, you could also determine if a date was tomorrow:

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

NO libs used


Yesterday

Today

Tomorrow

This year

Any year

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

Kotlin extension function:

fun Long.toPrettyDate(): String {
val nowTime = Calendar.getInstance()
val neededTime = Calendar.getInstance()
neededTime.timeInMillis = this
    

return if (neededTime[Calendar.YEAR] == nowTime[Calendar.YEAR]) {
if (neededTime[Calendar.MONTH] == nowTime[Calendar.MONTH]) {
when {
neededTime[Calendar.DATE] - nowTime[Calendar.DATE] == 1 -> {
//here return like "Tomorrow at 12:00"
"Tomorrow at " +  SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date(this))
}
nowTime[Calendar.DATE] == neededTime[Calendar.DATE] -> {
//here return like "Today at 12:00"
"Today at " +  SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date(this))
}
nowTime[Calendar.DATE] - neededTime[Calendar.DATE] == 1 -> {
//here return like "Yesterday at 12:00"
"Yesterday at " +  SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date(this))
}
else -> {
//here return like "May 31, 12:00"
SimpleDateFormat("MMMM d, HH:mm", Locale.getDefault()).format(Date(this))
}
}
} else {
//here return like "May 31, 12:00"
SimpleDateFormat("MMMM d, HH:mm", Locale.getDefault()).format(Date(this))
}
} else {
//here return like "May 31 2022, 12:00" - it's a different year we need to show it
SimpleDateFormat("MMMM dd yyyy, HH:mm", Locale.getDefault()).format(Date(this))
}
}

Another way to do it. In kotlin with recommended lib ThreeTen

  1. Add ThreeTen

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Add kotlin extensions.

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

If your API level is 26 or higher, then you better use LocalDate class:

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
}

If your app has lower API level, use

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

Kotlin

@Choletski solution but with seconds and 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()
}
}

You can pass here date.getTime() to get outputs like

Today at 18:34:45
Yesterday at 12:30:00
Tomorrow at 09:04:05

Without any library and simple code, work on every Kotlin project

//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()) {
...
}

This is the code I ended up with for now:

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

Here is a simple solution that I use:

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

This covers all the edge-cases that may occur.

Also quite pretty using as kotlin extension:

fun Calendar.isToday() : Boolean {
val today = Calendar.getInstance()
return today[Calendar.YEAR] == get(Calendar.YEAR) && today[Calendar.DAY_OF_YEAR] == get(Calendar.DAY_OF_YEAR)
}

And using:

if (calendar.isToday()) {
Log.d("Calendar", "isToday")
}

Blow snippet useful in recycler view header section.

Kotlin Extension:

fun Date.isYesterday(): Boolean = DateUtils.isToday(this.time + DateUtils.DAY_IN_MILLIS)


fun Date.isToday(): Boolean = DateUtils.isToday(this.time)




fun Date.toDateString(): String {
return when {
this.isToday() -> {
"Today"
}
this.isYesterday() -> {
"Yesterday"
}
else -> {
convetedDate.format(this)
}
}
}