Android'de bugün veya dün nasıl zaman bulunur


89

Sms göndermek için bir uygulama geliştiriyorum. Veritabanından saati alarak o anki saati kaydediyorum ve gönderilen geçmiş sayfasında gösteriyorum. Gönderme geçmişi sayfasında, mesajın gönderildiği zamanı görüntülemek istiyorum. Burada mesajın bugün veya dün veya daha önce dün gönderilip gönderilmediğini kontrol etmek istiyorum. Mesaj dün gönderilmişse, o zaman "Dün 20:00" ifadesini bu şekilde göstermem gerekir ve mesaj dün gönderilmiş olsa bile "Pazartesi 20:00" anlamına gelir. Nasıl yapılacağını bilmiyorum. Lütfen bilen varsa bana yardım et.


lütfen yaptığınız kodu
gösterin

@Keyser Bana bunu yapmanın yolunu söyleyebilir misin?
Manikandan

2
Henüz herhangi bir kod denemediğiniz için, hangi yardıma ihtiyacınız olacağını bilmiyorsunuz. Soru sormak erken. Size neyin sorun verdiğini görene kadar bekleyin.
David Schwartz

Veritabanından ne zaman veri alırsanız, son dönüştürme zamanını gönderilen kutusuna getir
Nirav Ranpara

@ user1498488 Java tarih / saat işlemeyle ilgili bazı öğreticiler bulun.
keyer

Yanıtlar:


51

Bunu android.text.format.DateFormat sınıfını kullanarak kolayca yapabilirsiniz. Bunun gibi bir şey dene.

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

Daha fazla anlayış için http://developer.android.com/reference/java/text/DateFormat.html adresini kontrol edin .


21
Doğru olduğundan emin misin? Sadece tarihleri ​​karşılaştırıyorsunuz, peki ya yıl ve ay? Bugün 20.11.2014, ancak kodunuz 20.10.2010 için "Bugün" gösteriyor
Daryn,

4
Bu cevap doğru değil. Belgelere göre, Calendar.DATE, DAY_OF_MONTH ile eşanlamlıdır. Bu nedenle ne yılı ne de ayı karşılaştırmıyorsunuz.
Joao Sousa

Evet doğru değil. (Calendar.DATE) == smsTime.get (Calendar.DATE) ay ve yılı değil, yalnızca tarihle eşleşir. 01.01.2012 ve 01.01.2017 için doğru döner
Anjum

1
"Bugün" metni için bu çözüm her zaman doğrudur, ancak "dün" metni için ayın ilk günü doğru değildir. Yöntem get (Calendar.DATE) ayın gününü döndürür ve örneğin 1 - 31 = -30 yerine 1 neyin "dün" gösterilmesi gerekir - çünkü 31 Aralık, 1 Ocak'ın önceki günüdür.
lukjar

"Bugün" ve "dün", çeke yalnızca Takvim'i değil, ayı ve yılı da
içermelidir. TARİH

245

Tarihin bugün olup olmadığını kontrol etmek için Android yardımcı program kitaplığını kullanın

DateUtils.isToday(long timeInMilliseconds)

Bu utils sınıfı ayrıca göreceli zamanlar için insan tarafından okunabilir dizeler sunar. Örneğin,

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

Zaman aralığının ne kadar kesin olması gerektiğini tanımlamak için oynayabileceğiniz birkaç parametre vardır.

DateUtils'e bakın


5
DateUtils.isToday (myDate.getTime ()) iyi çalışıyor, teşekkür ederim!
Loenix

4
Bu yalnızca yerel (UTC olmayan) zamanı mı yoksa UTC zaman damgalarını mı tüketiyor?
Matthias

5
DateUtils.isToday(long millis)@Maragues tarafından açıklandığı gibi çalışır, ancak bu yöntemi birim testi yapmak istediğiniz bir kod parçasında kullanırsanız (bir ViewModel veya bir Presenter gibi), testlerinizi çalıştırırken bir RuntimeException alacağınızı unutmayın. Bunun nedeni birim testleri için kullanılan android.jar'ın herhangi bir kod içermemesidir. Daha fazla bilgi için bağlantı
Kaskasi

82

Belirtildiği gibi , bugün DateUtils.isToday(d.getTime())olup olmadığını belirlemek için çalışacaktır Date d. Ancak buradaki bazı yanıtlar, bir tarihin dün olup olmadığını nasıl belirleyeceğinizi aslında yanıtlamıyor. Bunu aşağıdakilerle de kolayca yapabilirsiniz DateUtils:

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

Bunu takiben, yarın bir tarih olup olmadığını da belirleyebilirsin:

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

1
Kabul edilen cevap bu olmalıdır. Okuması basit ve etkili. Daha da etkili hale getirmenin tek yolu, bir milis zaman damgası için yöntemler yazmaktır, böylece kişi bunu Takvim, Tarih veya tercih ettiğiniz sınıfla birlikte kullanabilir.
joe1806772

Bu harika. Ancak bazı garip nedenlerden dolayı bunu fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
Kotlin'de

Bence bu, kelimenin tam anlamıyla iki satırlık kodda en iyi çözümdür ve işi bitirir
Amir Dora

işe yaradı. Teşekkürler: D !!
ppreetikaa

22

Bugün DateUtils.isTodayiçin android API'den kullanabilirsiniz .

Dün bu kodu kullanabilirsiniz:

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 mükemmellik!
swooby

Now.get (Calendar.MONTH) ile yukarıdaki kod önceki ayı döndürüyor gibi görünüyor !?
Tina

@tina bu yalnızca ayın ilk gününde gerçekleşmeli
lujop

9

Bunu deneyebilirsiniz:

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

8

API seviyeniz 26 veya daha yüksekse, LocalDate sınıfını kullanmanız daha iyi olur:

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
}

Uygulamanızın API düzeyi daha düşükse,

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

YOK kitap kullanılmıyor


Dün

Bugün

Yarın

Bu yıl

Herhangi bir yıl

 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

Bunu yapmanın başka bir yolu. Gelen KOTLIN lib tavsiye ile ThreeTen

  1. ThreeTen ekle

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Kotlin uzantıları ekleyin.

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

Gitmenin yolu bu olmalı. Özel ayrıştırma çok kötü.
XY

4

Kotlin

@Choletski çözümü ancak saniyelerle ve Kotlin'de

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

Gibi date.getTime()çıktılar almak için buraya geçebilirsiniz

Today at 18:34:45
Yesterday at 12:30:00
Tomorrow at 09:04:05

2

Bu, Whtsapp uygulamasının sahip olduğu Bugün, Dün ve Tarih gibi Değerleri alma yöntemidir.

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

Bu yöntemi kullanın sadece Milisaniye geçsin

 getSmsTodayYestFromMilli(Long.parseLong("1485236534000"));

Bu kodu kendi tarafınızda veya herhangi bir referans üzerinde test ettiniz mi?
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

sana bir şey önerebilirim. SMS gönderdiğinizde ayrıntıları bir veri tabanına kaydedin, böylece sms'nin gönderildiği tarih ve saati geçmiş sayfasında görüntüleyebilirsiniz.


Evet, zamanı veritabanında depoluyorum. Ama saklanan zamanın bugün mü dün mü yoksa dün mü olduğunu kontrol etmem gerekiyor.
Manikandan

eğer zamanı saklıyorsan. o zaman niye o tarihi de saklayamıyorsun?
Goofy

Evet yapabilirim ama metin görünümünde "Bugün 8:00" gibi göstermem gerekiyor
Manikandan

Bunu yapabilirsiniz ... Db'den tarihi alın ve bugünün tarihiyle karşılaştırın. Eşleşiyorsa, o zamanki tarih ise "Bugün" olarak bir metin görünümü görüntüleyin - revizyon tarihi ve ardından "Dün"
Goofy


0

DateUtils.isToday()android.text.format.Timeartık kullanımdan kaldırıldığı için kullanımdan kaldırılmış olarak kabul edilmelidir . İsToday için kaynak kodunu güncelleyene kadar, bugün, dün algılayan, gün ışığından yararlanma saatine / gün ışığından yararlanma saatine geçişleri işleyen ve kullanımdan kaldırılmış kodu kullanmayan bir çözüm yoktur. todayPeriyodik olarak güncellenmesi gereken bir alan kullanan Kotlin'de (örneğin, onResumevb.):

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

Ben açtı https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729 üzerinde, go oyu


0

Şimdilik bulduğum kod bu:

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

İşte kullandığım basit bir çözüm:

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

Bu, meydana gelebilecek tüm uç durumları kapsar.


-1

Herhangi bir kütüphane ve basit kod olmadan her Kotlin projesi üzerinde çalışın

//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()) {
...
}

Verilen yanıt, düşük Kaliteli Gönderi olarak incelenmek üzere işaretlendi. İşte nasıl iyi bir cevap yazabilirim? . Sağlanan bu cevap, bir açıklamadan yararlanabilir. Yalnızca kod yanıtları "iyi" yanıtlar olarak kabul edilmez. Gönderen İnceleme .
Trenton McKinney
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.