web-dev-qa-db-ja.com

時間を見つける方法はandroidで今日または昨日です

Iamは、SMSを送信するためのアプリケーションを開発しています。 Iamは現在の時刻を保存し、データベースから時刻を取得することで送信済み履歴ページに表示します。送信された履歴ページで、メッセージが送信された時刻を表示します。ここで、今日、昨日、またはその前の昨日、メッセージが送信されたことを確認します。メッセージが昨日送信された場合、「昨日20:00」と表示する必要があり、昨日送信されたメッセージも「月曜日20:00」を意味します。どうすればいいのかわかりません。誰か知っていたら助けてください。

66
Manikandan

これは、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 を確認してください。

40
Sudhanshu Gupta

日付が今日かどうかを確認するには、Android utils library

DateUtils.isToday(long timeInMilliseconds)

このutilsクラスは、人間が読める相対時間の文字列も提供します。例えば、

DateUtils.getRelativeTimeSpanString(long timeInMilliseconds) -> "42 minutes ago"

タイムスパンの精度を定義するために使用できるいくつかのパラメーターがあります

DateUtils を参照してください

197
Maragues

前述のように、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);
}
43
thebaer

今日は、 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);
}
22
lujop

これを試すことができます:

Calendar mDate = Calendar.getInstance(); // just for example
if (DateUtils.isToday(mDate.getTimeInMillis())) {
  //format one way
} else {
  //format in other way
}
9
Roman Golyshev

使用されるライブラリはありません


昨日

今日

明日

今年

任意の年

 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();
    }
}
3
Choletski

これは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"));
2
Rjz Satvara
    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";
1
Raluca Lucaci

別の方法。 kotlin推奨libでThreeTen

  1. ThreeTenを追加

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Kotlin拡張機能を追加します。

    fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L))
    
    fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())
    
1
Jack the Ripper

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 、投票に行きます

0
androidguy

私はあなたに一つのことを提案できます。 uがsmsを送信すると、詳細がデータベースに保存され、smsが送信された日時を履歴ページに表示できるようになります。

0
Goofy