我正在开发一个发送短信的应用程序。我正在存储当前时间并通过从数据库中检索时间来显示在发送的历史记录页面中。在发送历史记录页面中,我想显示消息的发送时间。在这里,我想检查消息是今天还是昨天或前天发送的那样。如果消息是昨天发送的,那么我需要像这样显示“昨天 20:00”,甚至昨天之前发送的消息也意味着“星期一 20:00”。我不知道该怎么做。如果有人知道,请帮助我。
17 回答
要检查日期是否是今天,请使用 Android utils 库
DateUtils.isToday(long timeInMilliseconds)
这个 utils 类还提供了相对时间的人类可读字符串。例如,
DateUtils.getRelativeTimeSpanString(long timeInMilliseconds) -> "42 minutes ago"
您可以使用几个参数来定义时间跨度的精确度
请参阅DateUtils
如前所述,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);
}
您可以使用 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以进一步了解。
今天你可以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);
}
没有使用库
昨天
今天
明天
今年
任何一年
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 扩展功能:
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))
}
}
你可以试试这个:
Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
//format one way
} else {
//format in other way
}
如果您的 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)
}
另一种方法。在kotlin中使用推荐的 lib 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())
科特林
@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
这是获取诸如今天、昨天和日期之类的值的方法,例如 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"));
用作 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")
}
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";
我可以建议你一件事。当您发送短信时,将详细信息存储到数据库中,以便您可以在历史页面中显示发送短信的日期和时间。
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,去投票吧
这是我现在结束的代码:
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()
}
}
}
这是我使用的一个简单解决方案:
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));
}
这涵盖了所有可能发生的边缘情况。
无需任何库和简单代码,即可处理每个 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()) {
...
}