SMSを送信するためのアプリケーションを開発しています。データベースから時刻を取得して、現在の時刻を保存し、送信履歴ページに表示しています。送信履歴ページにメッセージの送信時刻を表示したい。ここで、メッセージが今日、昨日、または一昨日のように送信されたことを確認したいと思います。メッセージが昨日送信された場合、そのように「昨日 20:00」を表示する必要があり、昨日送信されたメッセージでさえ「月曜日 20:00」を意味します。どうすればいいのかわからない。知ってる人いたら教えてください。
17 に答える
これは、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 APIDateUtils.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);
}
これを試すことができます:
Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
//format one way
} else {
//format in other way
}
それを行う別の方法。推奨ライブラリ ThreeTenを使用したkotlinで
スリーテンを追加
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())
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";
私はあなたに一つのことを提案することができます。SMSを送信するときは、詳細をデータベースに保存して、SMSが送信された日時を履歴ページに表示できるようにします。
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を提出し、投票します