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


89

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


...あなたが行っていることを、あなたのコードを表示してください
グーフィー

@Keyserそれを行う方法を教えてもらえますか?
マニカンダン2012年

2
まだコードを試したことがないので、どのような支援が必要かわかりません。質問をするのは時期尚早です。何が問題になるかがわかるまで待ちます。
David Schwartz

データベースからデータをフェッチするときはいつでも、送信されたボックスで最後の変換をフェッチします
Nirav Ranpara

@ user1498488Javaの日付/時刻処理に関するチュートリアルをいくつか見つけてください。
キーザー

回答:


51

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


21
それが正しいと確信していますか?日付だけを比較しますが、年と月はどうですか?今日は2014
Daryn

4
この答えは正しくありません。ドキュメントによると、Calendar.DATEはDAY_OF_MONTHの同義語です。したがって、年も月も比較していません。
Joao Sousa

はい、正しくありません。(Calendar.DATE)== smsTime.get(Calendar.DATE)は日付のみに一致し、月と年には一致しません。それは2012年1月1日と2017年1月1日のためにtrueを返します
Anjum

1
「今日」のテキストの場合、この解決策は常に正しいですが、「昨日」のテキストの場合、月の最初の日に正しくありません。メソッドget(Calendar.DATE)は月の日を返します。たとえば、12月31日は1月1日の前日であるため、「昨日」を表示するのは1ではなく1 --31 = -30です。
lukjar

「今日」と「昨日」の必要性チェックの月と年を含むように、Calendar.DATEだけではなく
ZakariaBK

245

日付が今日かどうかを確認するには、Androidutilsライブラリを使用します

DateUtils.isToday(long timeInMilliseconds)

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

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

期間をどの程度正確にするかを定義するために使用できるいくつかのパラメーターがあります

DateUtilsを参照してください


5
DateUtils.isToday(myDate.getTime())は正常に機能しています、ありがとうございます!
Loenix 2015

4
これはローカル(非UTC)時間またはUTCタイムスタンプのみを消費しますか?
マティアス

5
DateUtils.isToday(long millis)@Maraguesで説明されているように機能しますが、単体テストを行うコード(ViewModelやPresenterなど)でこのメソッドを使用すると、テストの実行時にRuntimeExceptionが発生することに注意してください。これは、単体テストに使用されるandroid.jarにコードが含まれていないためです。詳細リンク
Kaskasi 2016年

82

述べたように、今日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);
}

1
これは受け入れられた答えでなければなりません。読みやすく、効果的です。それをさらに効果的にする唯一の方法は、ミリ秒のタイムスタンプのメソッドを作成することです。これにより、Calendar、Date、または任意のクラスで使用できます。
joe1806772 2017年

これは素晴らしい。しかし、いくつかの奇妙な理由で、私は次のようにKotlinに拡張機能としてこれを使用することはできませんよ:fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
サイファー・ラーマンMohsin

これは、文字通り2行のコードで作業を完了するのに最適なソリューションだと思います
AmirDora。

機能した。ありがとう !!
ppreetikaa

22

今日DateUtils.isTodayAndroidAPIから使用できます

昨日は、次のコードを使用できます。

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);
}

@lujpo完璧!
swooby 2016

上記のnow.get(Calendar.MONTH)のコードは、前月を返すようです!?
ティナ

@tinaそれは月の最初の日にのみ発生するはずです
lujop 2018年

9

あなたはこれを試すことができます:

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

8

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)
} 

5

ライブラリは使用されていません


昨日

今日

明日

今年

いつでも

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

4

それを行う別の方法。で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())
    

これが進むべき道です。カスタム解析は悪いです。
XY

4

Kotlin

@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

2

これは、今日、昨日、日付のような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"));

このコードを自分の側または参照でテストしましたか?
androidXP

1
    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";

0

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


はい、データベースに時間を保存しています。でも、保存されている時間が今日なのか、昨日なのか、昨日なのかを確認する必要があります。
マニカンダン2012年

時間を保存する場合、なぜ彼の日付も保存できないのですか?
グーフィー

はい、できますが、テキストビューで「今日の8:00」のように表示する必要があります
マニカンダン

Uはそれを行うことができます... Dbから日付を取得し、今日の日付と比較します。一致する場合は、現在の日付の場合は「今日」としてテキストビューを表示します-過去の日付は「昨日」を表示します
グーフィー


0

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を提出し、投票してください


0

これは私が今のところ最終的に作ったコードです:

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()
        }
    }
}

0

これが私が使用する簡単な解決策です:

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));
}

これは、発生する可能性のあるすべてのエッジケースをカバーします。


-1

ライブラリと単純なコードがなくても、すべての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()) {
...
}

提供された回答は、低品質の投稿としてレビュー用にフラグが付けられました。ここではいくつかのためのガイドラインです、私は良い答えを書くにはどうすればよいですか?。この提供された答えは、説明から利益を得ることができます。コードのみの回答は「良い」回答とは見なされません。レビューから。
トレントンマッキニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.