Iam正在开发用于发送短信的应用程序。Iam存储当前时间,并通过从数据库中检索时间来显示在已发送的历史记录页面中。在已发送的历史页面中,我想显示消息的发送时间。在这里,我想检查邮件是今天还是昨天或昨天之前发送的。如果消息是昨天发送的,那么我需要显示“昨天20:00”,甚至消息是昨天发送的,之前是“星期一20:00”。我不知道该怎么做。如果有人知道,请帮助我。
Iam正在开发用于发送短信的应用程序。Iam存储当前时间,并通过从数据库中检索时间来显示在已发送的历史记录页面中。在已发送的历史页面中,我想显示消息的发送时间。在这里,我想检查邮件是今天还是昨天或昨天之前发送的。如果消息是昨天发送的,那么我需要显示“昨天20:00”,甚至消息是昨天发送的,之前是“星期一20:00”。我不知道该怎么做。如果有人知道,请帮助我。
Answers:
您可以使用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以进一步了解。
要检查日期是否是今天,请使用Android utils库
DateUtils.isToday(long timeInMilliseconds)
该utils类还提供相对时间的人类可读字符串。例如,
DateUtils.getRelativeTimeSpanString(long timeInMilliseconds) -> "42 minutes ago"
您可以使用几个参数来定义时间跨度的精确度
DateUtils.isToday(long millis)
按照@Maragues的描述工作,但请注意,如果在要进行单元测试的代码段中使用此方法(例如ViewModel或Presenter),则在运行测试时会收到RuntimeException。这是因为用于单元测试的android.jar不包含任何代码。有关更多信息链接
如前所述,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);
}
fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
对于今天你可以使用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);
}
如果您的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)
}
昨天
今天
明天
今年
任何一年
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();
}
}
另一种方法。在科特林与推荐的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())
@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
这是获取值的方法,例如今天,昨天和日期,例如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"));
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()) {
...
}