如何在Android中找到时间是今天还是昨天


87

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


请显示您已完成的代码...
Goofy 2012年

@Keyser你能告诉我怎么做吗?
Manikandan 2012年

2
由于尚未尝试任何代码,因此您不知道需要什么帮助。问一个问题还为时过早。等到看到什么给您带来麻烦为止。
大卫·史瓦兹

每当您从数据库中获取数据时,都在发送框中获取上次转换的时间
Nirav Ranpara 2012年

@ user1498488只需找到一些有关Java日期/时间处理的教程。
键盘输入2012年

Answers:


51

您可以使用android.text.format.DateFormat类轻松做到这一点。尝试这样的事情。

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

检查http://developer.android.com/reference/java/text/DateFormat.html以进一步了解。


21
您确定它是正确的吗?您只比较日期,那么年份和月份呢?今天是2014
Daryn 2014年

3
这个答案是不正确的。根据文档,Calendar.DATE是DAY_OF_MONTH的同义词。因此,您既不比较年份也不比较月份。
Joao Sousa

是的,这是不正确的。(Calendar.DATE)== smsTime.get(Calendar.DATE)仅匹配日期,不匹配月份和年份。它会在2012
Anjum

1
对于“今天”文本,此解决方案始终是正确的,但对于“昨天”文本,该解决方案在每月的第一天是不正确的。方法get(Calendar.DATE)返回月份中的某天,例如1-31 = -30而不是1,应显示“昨天”-因为12月31日是1月1日的前一天。
lukjar '19

“今天”和“昨天”需要在支票中包括月份和年份,而不仅仅是Calendar.DATE
ZakariaBK

242

要检查日期是否是今天,请使用Android utils库

DateUtils.isToday(long timeInMilliseconds)

该utils类还提供相对时间的人类可读字符串。例如,

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

您可以使用几个参数来定义时间跨度的精确度

参见DateUtils


5
DateUtils.isToday(myDate.getTime())工作正常,谢谢!
Loenix

4
这是否仅消耗本地(非UTC)时间或UTC时间戳?
马提亚斯(Matthias)2015年

5
DateUtils.isToday(long millis)按照@Maragues的描述工作,但请注意,如果在要进行单元测试的代码段中使用此方法(例如ViewModel或Presenter),则在运行测试时会收到RuntimeException。这是因为用于单元测试的android.jar不包含任何代码。有关更多信息链接
Kaskasi '16

78

如前所述,DateUtils.isToday(d.getTime())将用于确定是否Date d是今天。但是,这里的某些回答实际上并没有回答如何确定日期是否是昨天。您也可以使用DateUtils以下命令轻松完成此操作:

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

之后,您还可以确定日期是否是明天:

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

这应该是公认的答案。易于阅读,且有效。使其更有效的唯一方法是编写毫秒时间戳的方法,因此可以将其与Calendar,Date或您喜欢的任何类一起使用。
joe1806772

这很棒。但是出于某些奇怪的原因,我无法像在Kotlin中那样使用它作为扩展功能:fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
Saifur Ra​​hman Mohsin

我认为这是字面上两行代码就可以完成工作最好的解决方案
阿米尔多拉。

22

对于今天你可以使用DateUtils.isToday来自Android的API

对于昨天,您可以使用该代码:

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

@lujpo完美!
swooby

上面带有now.get(Calendar.MONTH)的代码似乎返回了上个月!
蒂娜

@tina它应该只发生在每月的第一天
lujop

9

您可以尝试以下方法:

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

7

如果您的API级别为26或更高,则最好使用LocalDate类:

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
}

如果您的应用具有较低的API级别,请使用

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

5

没有使用库


昨天

今天

明天

今年

任何一年

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

4

另一种方法。在科特林与推荐的lib ThreeTen

  1. 加ThreeTen

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. 添加kotlin扩展名。

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

这应该是要走的路。自定义解析是很糟糕的。
XY

4

科特林

@Choletski解决方案,但用秒和在科特林

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

您可以通过此处date.getTime()获取类似的输出

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

2

这是获取值的方法,例如今天,昨天和日期,例如Whtsapp应用程序具有

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

使用这种方法只需传递毫秒

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

您是否在自己或任何参考文献中测试了此代码?
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";

0

我可以建议你一件事。当您发送短信时,请将详细信息存储到数据库中,以便您可以在历史记录页面中显示发送短信的日期和时间。


是的,我将时间存储在数据库中。但是我需要先检查存储时间是今天还是昨天还是昨天。
Manikandan '10 -10-10

如果您存储时间。那么为什么您也不能存储日期呢?
2012年

是的,我可以,但是我需要像在文本视图中那样显示“ Today 8:00”
Manikandan 2012年

U可以执行此操作...从Db中获取日期,并与今天的date.if进行比较,然后将其显示为“今天”(如果是当前日期),则显示文本视图-上一个日期,然后显示“昨天”
高飞


0

DateUtils.isToday()应该被视为已弃用,因为android.text.format.Time现在已弃用。在他们更新isToday的源代码之前,这里没有解决方案可以检测今天(昨天),昨天,从夏时制到/从夏时制的转移,并且不使用不推荐使用的代码。这是在Kotlin中,使用today必须定期更新的字段(例如,onResume等):

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

我提交了https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729,请对其进行投票


0

这是我现在最终得到的代码:

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

0

这是我使用的简单解决方案:

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

这涵盖了所有可能发生的边缘情况。


-1

无需任何库和简单代码,即可在每个Kotlin项目上工作

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

提供的答案被标记为低质量帖子,以供审核。以下是一些有关如何写一个好的答案的准则。提供的答案可以从解释中受益。仅代码答案不视为“好”答案。从评论
特伦顿·麦金尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.