Iamは、SMSを送信するためのアプリケーションを開発しています。 Iamは現在の時刻を保存し、データベースから時刻を取得することで送信済み履歴ページに表示します。送信された履歴ページで、メッセージが送信された時刻を表示します。ここで、今日、昨日、またはその前の昨日、メッセージが送信されたことを確認します。メッセージが昨日送信された場合、「昨日20:00」と表示する必要があり、昨日送信されたメッセージも「月曜日20:00」を意味します。どうすればいいのかわかりません。誰か知っていたら助けてください。
これは、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 library
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 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);
}
これを試すことができます:
Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
//format one way
} else {
//format in other way
}
昨日
今日
明日
今年
任意の年
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();
}
}
これはToday、昨日、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";
別の方法。 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())
DateUtils.isToday()
は、Android.text.format.Time
は廃止されました。 isTodayのソースコードを更新するまで、今日、昨日を検出し、夏時間への移行と夏時間からの移行を処理し、非推奨のコードを使用しないソリューションはありません。ここでは、定期的に最新の状態に保つ必要があるtoday
フィールドを使用して、Kotlinにあります(例: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 、投票に行きます
私はあなたに一つのことを提案できます。 uがsmsを送信すると、詳細がデータベースに保存され、smsが送信された日時を履歴ページに表示できるようになります。