Cara mencari waktu hari ini atau kemarin di android

89

Saya sedang mengembangkan aplikasi untuk mengirim sms. Iam menyimpan waktu saat ini dan menampilkan di halaman riwayat terkirim dengan mengambil waktu dari database. Di halaman riwayat terkirim saya ingin menampilkan waktu pesan dikirim. Di sini saya ingin memeriksa apakah pesan sudah dikirim hari ini atau kemarin atau kemarin seperti itu. Jika pesan terkirim kemarin berarti saya perlu menampilkan "Kemarin 20:00" seperti itu dan bahkan pesan dikirim kemarin sebelumnya berarti "Senin 20:00". Saya tidak tahu bagaimana itu harus dilakukan. Tolong bantu saya jika ada yang tahu.

Manikandan
sumber
tolong tunjukkan kode Anda yang telah Anda lakukan ...
Goofy
@Bisakah Anda memberi tahu saya cara melakukannya?
Manikandan
2
Karena Anda belum mencoba kode apa pun, Anda tidak tahu bantuan apa yang Anda perlukan. Mengajukan pertanyaan terlalu dini. Tunggu sampai Anda melihat apa yang membuat Anda kesulitan.
David Schwartz
setiap kali Anda mengambil data dari database, ambil waktu konversi terakhir di kotak terkirim
Nirav Ranpara
@ user1498488 Temukan saja beberapa tutorial tentang penanganan tanggal / waktu Java.
Keyer

Jawaban:

51

Anda dapat melakukannya dengan mudah menggunakan kelas android.text.format.DateFormat. Cobalah sesuatu seperti ini.

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

Lihat http://developer.android.com/reference/java/text/DateFormat.html untuk pemahaman lebih lanjut.

Sudhanshu Gupta
sumber
21
Apakah Anda yakin itu benar? Anda hanya membandingkan tanggal, bagaimana dengan tahun dan bulan? Hari ini adalah 20.11.2014, tetapi kode Anda menunjukkan "Hari ini" untuk
20.10.2010
4
Jawaban ini tidak benar. Sesuai dokumentasi, Calendar.DATE adalah sinonim untuk DAY_OF_MONTH. Oleh karena itu, Anda tidak membandingkan baik tahun maupun bulannya.
Joao Sousa
Ya, itu tidak benar. (Calendar.DATE) == smsTime.get (Calendar.DATE) hanya cocok dengan tanggal, bukan bulan dan tahun. itu mengembalikan true untuk 01.01.2012 dan 01.01.2017
Anjum
1
Untuk teks "hari ini", solusi ini selalu benar, tetapi untuk teks "kemarin". Solusi ini tidak benar pada hari pertama setiap bulan. Metode get (Calendar.DATE) mengembalikan hari dalam sebulan dan misalnya 1 - 31 = -30 sebagai gantinya 1 yang seharusnya menampilkan "kemarin" - karena 31 Desember adalah hari sebelumnya pada tanggal 1 Januari.
lukjar
"Hari ini" dan "kemarin" perlu menyertakan bulan dan tahun dalam cek, tidak hanya di Kalender.
TANGGAL
245

Untuk memeriksa apakah tanggalnya hari ini, gunakan perpustakaan Android utils

DateUtils.isToday(long timeInMilliseconds)

Kelas utils ini juga menawarkan string yang dapat dibaca manusia untuk waktu relatif. Sebagai contoh,

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

Ada beberapa parameter yang dapat Anda gunakan untuk menentukan seberapa tepat rentang waktu seharusnya

Lihat DateUtils

Maragues
sumber
5
DateUtils.isToday (myDate.getTime ()) berfungsi dengan baik, terima kasih!
Loenix
4
Apakah ini memakan waktu lokal (non-UTC) atau hanya stempel waktu UTC?
Matthias
5
DateUtils.isToday(long millis)berfungsi seperti yang dijelaskan oleh @Maragues, namun perlu diketahui, bahwa jika Anda menggunakan metode ini dalam potongan kode yang ingin Anda uji unit (seperti ViewModel atau Presenter), Anda akan mendapatkan RuntimeException saat menjalankan pengujian. Ini karena android.jar yang digunakan untuk pengujian unit tidak berisi kode apa pun. Untuk tautan
Kaskasi
82

Seperti yang disebutkan, DateUtils.isToday(d.getTime())akan bekerja untuk menentukan apakah Date dhari ini. Tetapi beberapa tanggapan di sini tidak benar-benar menjawab bagaimana menentukan apakah suatu tanggal adalah kemarin. Anda juga dapat melakukannya dengan mudah dengan DateUtils:

public static boolean isYesterday(Date d) {
    return DateUtils.isToday(d.getTime() + DateUtils.DAY_IN_MILLIS);
}

Setelah itu, Anda juga bisa menentukan apakah tanggalnya besok:

public static boolean isTomorrow(Date d) {
    return DateUtils.isToday(d.getTime() - DateUtils.DAY_IN_MILLIS);
}
thebaer
sumber
1
Ini harus menjadi jawaban yang diterima. Mudah dibaca dan efektif. Satu-satunya cara untuk membuatnya lebih efektif adalah dengan menulis metode untuk stempel waktu milis, sehingga seseorang dapat menggunakannya dengan Kalender, Tanggal atau kelas apa pun yang Anda inginkan.
joe1806772
Ini bagus. Tetapi untuk beberapa alasan aneh saya tidak dapat menggunakan ini sebagai fungsi ekstensi di Kotlin seperti:fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
Saifur Rahman Mohsin
Saya pikir ini adalah solusi terbaik dalam dua baris kode yang menyelesaikan pekerjaan
Amir Dora.
itu berhasil. Terimakasih !!
ppreetikaa
22

Untuk hari ini Anda dapat menggunakan DateUtils.isTodaydari API android .

Untuk kemarin Anda dapat menggunakan kode itu:

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);
}
lujop
sumber
@lujpo kesempurnaan!
swooby
Kode di atas dengan now.get (Calendar.MONTH) sepertinya kembali ke bulan sebelumnya !?
Tina
@tina seharusnya hanya terjadi pada hari pertama setiap bulan
lujop
9

Anda dapat mencoba ini:

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

Jika API level Anda 26 atau lebih tinggi, maka Anda lebih baik menggunakan kelas 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
}

Jika aplikasi Anda memiliki level API yang lebih rendah, gunakan

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)
} 
Константин Семочкин
sumber
5

TIDAK ada lib yang digunakan


Kemarin

Hari ini

Besok

Tahun ini

Setiap tahun

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

Cara lain untuk melakukannya. Di kotlin dengan lib ThreeTen yang direkomendasikan

  1. Tambahkan ThreeTen

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Tambahkan ekstensi kotlin.

    fun LocalDate.isYesterday(): Boolean = this.isEqual(LocalDate.now().minusDays(1L))
    
    fun LocalDate.isToday(): Boolean = this.isEqual(LocalDate.now())
    
PsychedelicSubstance
sumber
Ini harus menjadi cara untuk pergi. Penguraian kustom itu buruk.
XY
4

Kotlin

Solusi @Choletski tetapi dengan detik dan di 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()
        }
    }

Anda bisa lewat di sini date.getTime()untuk mendapatkan keluaran seperti

Today at 18:34:45
Yesterday at 12:30:00
Tomorrow at 09:04:05
Gastón Saillén
sumber
2

Ini adalah metode untuk mendapatkan Nilai seperti Hari Ini, Kemarin dan Tanggal seperti yang dimiliki aplikasi 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);
        }
    }

Gunakan metode ini hanya lewat Milidetik seperti

 getSmsTodayYestFromMilli(Long.parseLong("1485236534000"));
Rjz Satvara
sumber
Apakah Anda menguji kode ini di pihak Anda atau referensi apa pun?
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";
Raluca Lucaci
sumber
0

saya dapat menyarankan Anda satu hal. Saat Anda mengirim sms, simpan detailnya ke dalam database sehingga Anda dapat menampilkan tanggal dan waktu pengiriman sms di halaman histori.

Bodoh
sumber
Ya saya menyimpan waktu di database. Tetapi saya perlu memeriksa apakah waktu yang disimpan hari ini atau kemarin atau kemarin sebelum seperti itu.
Manikandan
Jika Anda menyimpan waktu. lalu mengapa Anda tidak bisa menyimpan tanggal juga?
Goofy
Ya saya bisa tapi saya perlu menunjukkan seperti "Hari ini 8:00" seperti itu di textview
Manikandan
Anda dapat melakukan itu ... dapatkan tanggal dari Db dan bandingkan dengan tanggal hari ini. Jika cocok maka tampilkan tampilan teks sebagai "Hari Ini" jika tanggal saat ini - tanggal sebelumnya maka tampilkan "Kemarin"
Gufi
0

DateUtils.isToday()harus dianggap usang karena android.text.format.Timesekarang tidak digunakan lagi. Hingga mereka memperbarui kode sumber untuk isToday, tidak ada solusi di sini yang mendeteksi hari ini, kemarin, menangani pergeseran ke / dari waktu musim panas, dan tidak menggunakan kode yang tidak digunakan lagi. Ini dia di Kotlin, menggunakan kolom todayyang harus selalu diperbarui secara berkala (mis., onResumeDll):

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

Saya mengajukan https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729 , berikan suara untuk itu

androidguy
sumber
0

Ini adalah kode yang saya dapatkan untuk saat ini:

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()
        }
    }
}
EpicPandaForce
sumber
0

Berikut adalah solusi sederhana yang saya gunakan:

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

Ini mencakup semua kasus tepi yang mungkin terjadi.

Aman Raj Sundram
sumber
-1

Tanpa pustaka dan kode sederhana apa pun, kerjakan setiap proyek 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()) {
...
}
Anthone
sumber
Jawaban yang diberikan ditandai untuk ditinjau sebagai Postingan Berkualitas Rendah. Berikut adalah beberapa pedoman untuk Bagaimana cara menulis jawaban yang baik? . Jawaban yang diberikan ini bisa mendapatkan keuntungan dari penjelasan. Jawaban kode saja tidak dianggap sebagai jawaban "baik". Dari Review .
Trenton McKinney