我开发了一个发送短信的应用程序。 Iam通过从数据库中检索时间来存储当前时间并显示在发送的历史记录页面中。在发送的历史记录页面中,我想显示发送消息的时间。在这里,我想检查消息是在今天或昨天或昨天之前发送的。如果昨天发送的消息意味着我需要显示"昨天20:00"就像那样,甚至消息是在昨天20:00"周日之前发送的。我不知道该怎么做。如果有人知道,请帮助我。
答案 0 :(得分:188)
要检查日期是否为今天,请使用Android utils库
DateUtils.isToday(long timeInMilliseconds)
此utils类还提供相对时间的人类可读字符串。例如,
DateUtils.getRelativeTimeSpanString(long timeInMilliseconds) -> "42 minutes ago"
您可以使用几个参数来定义时间跨度的精确程度
请参阅DateUtils
答案 1 :(得分:40)
您可以使用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以进一步了解。
答案 2 :(得分:40)
如上所述,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);
}
答案 3 :(得分:21)
今天,您可以使用android API中的DateUtils.isToday
。
昨天你可以使用该代码:
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);
}
答案 4 :(得分:9)
你可以试试这个:
Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
//format one way
} else {
//format in other way
}
答案 5 :(得分:8)
如果您的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)
}
答案 6 :(得分:4)
@Choletski解决方案,但仅需几秒钟,并且使用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()
}
}
您可以在这里date.getTime()
传递类似的输出
Today at 18:34:45
Yesterday at 12:30:00
Tomorrow at 09:04:05
答案 7 :(得分:3)
<强>昨天强>
今天
<强>明天强>
今年
任何一年
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();
}
}
答案 8 :(得分: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";
答案 9 :(得分:1)
这是获取像今日,昨天和日期这样的值的方法,如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"));
答案 10 :(得分: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,对其进行投票
答案 11 :(得分:0)
答案 12 :(得分:0)
另一种方法。在 kotlin 中,建议使用lib ThreeTen
添加ThreeTen
implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
添加kotlin扩展名。
fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L))
fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())
答案 13 :(得分: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()
}
}
}
答案 14 :(得分: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));
}
这涵盖了所有可能发生的极端情况。
答案 15 :(得分:0)
作为 kotlin 扩展也很漂亮:
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)
}
并使用:
if (calendar.isToday()) {
Log.d("Calendar", "isToday")
}
答案 16 :(得分:-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()) {
...
}