Android में आज या कल का समय कैसे पाया जाता है


89

Iam sms भेजने के लिए एक एप्लीकेशन विकसित करना। Iam डेटाबेस से समय पुनर्प्राप्त करके वर्तमान समय को संग्रहीत करना और भेजे गए इतिहास पृष्ठ में दिखाना है। भेजे गए इतिहास पृष्ठ में मैं संदेश भेजने का समय प्रदर्शित करना चाहता हूं। यहां मैं यह जांचना चाहता हूं कि संदेश आज या कल या उससे पहले कल भेजा गया है। यदि संदेश कल भेजा गया था, तो मुझे उसी तरह "कल 20:00" प्रदर्शित करने की आवश्यकता है और यहां तक ​​कि संदेश कल "सोमवार 20:00" से पहले भी भेजा गया था। मुझे नहीं पता कि यह कैसे करना है। अगर कोई जानता है तो कृपया मेरी मदद करें।


कृपया अपना कोड प्रदर्शित करें जो आपने किया है ...
नासमझ

@Keyser क्या आप मुझे इसे करने का तरीका बता सकते हैं?
मणिकंदन

2
चूंकि आपने अभी तक किसी भी कोड की कोशिश नहीं की है, आप नहीं जानते कि आपको किस मदद की आवश्यकता होगी। प्रश्न पूछना समय से पहले है। जब तक आप देखते हैं कि आपको क्या परेशानी है, तब तक प्रतीक्षा करें।
डेविड श्वार्ट्ज

जब भी आप डेटाबेस से डेटा प्राप्त करते हैं, तो भेजे गए बॉक्स में रूपांतरण का अंतिम समय प्राप्त करते हैं
नीरव रणपर

@ user1498488 बस जावा डेट / टाइम हैंडलिंग पर कुछ ट्यूटोरियल देखें।
कीसर

जवाबों:


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
क्या आप सुनिश्चित हैं कि यह सही है? आप केवल तारीखों की तुलना करते हैं, वर्ष और महीने के बारे में क्या? आज 20.11.2014 है, लेकिन आपका कोड 20.10.2010 के लिए "आज" दिखाता है
Daryn

4
यह उत्तर सही नहीं है। प्रलेखन के अनुसार, Calendar.DATE DAY_OF_MONTH का एक पर्याय है। इसलिए आप न तो वर्ष और न ही महीने की तुलना कर रहे हैं।
जोआओ सोसा

हां, यह सही नहीं है। (Calendar.DATE) == smsTime.get (Calendar.DATE) केवल दिनांक, माह और वर्ष से मेल खाता है। यह 01.01.2012 और 01.01.2017 के लिए सही है
अंजुम

1
"आज" पाठ के लिए यह समाधान हमेशा सही है, लेकिन "कल" ​​पाठ के लिए यह महीने के पहले दिन में सही नहीं है। विधि प्राप्त करें (कैलेंडर। डेट) महीने का दिन लौटाता है और उदाहरण के लिए 1 - 31 = -30 इसके बजाय 1 "कल" ​​को प्रदर्शित करना चाहिए - क्योंकि 31 दिसंबर 1 जनवरी के पहले दिन है।
लूजर

"आज" और "कल" ​​को महीने और वर्ष को चेक में शामिल करने की आवश्यकता है, न केवल Calendar.DATE
ZakariaBK

245

अगर आज तारीख है, तो यह जांचने के लिए कि एंड्रॉइड यूटील लाइब्रेरी का इस्तेमाल करें

DateUtils.isToday(long timeInMilliseconds)

यह बर्तन वर्ग भी रिश्तेदार समय के लिए मानव पठनीय तार प्रदान करता है। उदाहरण के लिए,

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

कई पैरामीटर हैं जो आप यह परिभाषित करने के लिए खेल सकते हैं कि समय अवधि कितनी सटीक होनी चाहिए

DateUtils देखें


5
DateUtils.isToday (myDate.getTime ()) ठीक काम कर रहा है, धन्यवाद!
Loenix

4
क्या यह स्थानीय (गैर-यूटीसी) समय या यूटीसी-टाइमस्टैम्प का उपभोग कर रहा है?
मथियास

5
DateUtils.isToday(long millis)@Maragues द्वारा वर्णित के रूप में काम करता है, लेकिन जागरूक रहें, यदि आप इस पद्धति का उपयोग उस कोड के टुकड़े में करते हैं, जिसे आप इकाई परीक्षण (एक ViewModel या प्रस्तुतकर्ता की तरह) करना चाहते हैं, तो आपको उनके परीक्षण चलाते समय एक RuntimeException मिलेगी। यह इस तथ्य के कारण है कि यूनिट परीक्षणों के लिए उपयोग किए जाने वाले android.jar में कोई कोड नहीं है। अधिक जानकारी के लिंक के लिए
काकसी

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
यह स्वीकृत उत्तर होना चाहिए। पढ़ने में सरल, और प्रभावी। केवल इसे और भी प्रभावी बनाने का तरीका मिलिस टाइमस्टैम्प के लिए तरीके लिखना होगा, इसलिए कोई भी इसे कैलेंडर, दिनांक या जो भी वर्ग आपको पसंद करता है, के साथ उपयोग कर सकता है।
joe1806772 16

यह भी खूब रही। लेकिन किसी अजीब कारण के लिए मैं इसे कोटलिन में एक विस्तार समारोह के रूप में उपयोग करने में सक्षम नहीं हूं जैसे:fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
सैफुर रहमान मोहसिन

मुझे लगता है कि यह शाब्दिक रूप से कोड की दो पंक्तियों में सबसे अच्छा समाधान है जो काम करता है
अमीर डोरा।

इसने काम कर दिया। धन्यवाद: डी !!
ppreetikaa

22

आज के लिए आप Android APIDateUtils.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);
}

@lujpo पूर्णता!
स्वोबी

अब के साथ उपरोक्त कोड .get (Calendar.MONTH) पिछले महीने वापस आ रहा है !?
टीना

@ टीना यह केवल महीने के पहले दिन में होना चाहिए
लूजोप

9

आप यह कोशिश कर सकते हैं:

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

8

यदि आपका एपीआई स्तर 26 या अधिक है, तो आप लोकलडेट श्रेणी का बेहतर उपयोग करते हैं:

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
}

यदि आपके ऐप में एपीआई स्तर कम है, तो उपयोग करें

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. तीन जोड़ें

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. कोटलिन एक्सटेंशन जोड़ें।

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

यही रास्ता तय करना चाहिए। कस्टम पार्सिंग सिर्फ खराब है।
XY

4

Kotlin

@Choltski समाधान लेकिन सेकंड के साथ और कोटलिन में

 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

व्हाट्सएप जैसे वैल्यू टुडे, टुमॉरो और डेट पाने के लिए यह तरीका है

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

इस विधि का उपयोग करें जैसे Millisecond पास करें

 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

मैं आपको एक बात सुझा सकता हूं। जब आप एसएमएस भेजते हैं तो विवरणों को एक डेटाबेस में संग्रहीत करते हैं ताकि आप उस तारीख और समय को प्रदर्शित कर सकें जिस दिन एसएमएस को इतिहास पृष्ठ में भेजा गया था।


हाँ iam डेटाबेस में समय संग्रहीत करता है। लेकिन मुझे यह जाँचने की आवश्यकता है कि संग्रहीत समय आज है या कल या उससे पहले कल।
मणिकंदन

अगर उर समय का भंडारण कर रहा है। तो वह कैंट यू स्टोर क्यों कर सकता है?
नासमझ

हां, लेकिन मुझे "टुडे 8:00" जैसा दिखाने की जरूरत है जैसे कि टेक्स्टव्यू में
मणिकंदन

U ऐसा कर सकते हैं ... Db से तारीख प्राप्त करें और आज की तारीख से तुलना करें। यदि यह मेल खाता है तो "आज" के रूप में एक पाठ दृश्य प्रदर्शित करें यदि यह वर्तमान तिथि है - स्पष्ट तिथि तो "कल" ​​प्रदर्शित करें
नासमझ


0

DateUtils.isToday()android.text.format.Timeअब पदावनत माना जाना चाहिए क्योंकि अब पदावनत कर दिया गया है। जब तक वे आइसोडे के लिए स्रोत कोड को अपडेट नहीं करते हैं, तब तक यहां कोई समाधान नहीं है जो आज का पता लगाता है, कल, दिन की बचत समय से / तक शिफ्ट संभालता है, और पदावनत कोड का उपयोग नहीं करता है। यहां यह कोटलिन में है, एक ऐसे 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

किसी भी पुस्तकालय और सरल कोड के बिना, हर कोटलिन परियोजना पर काम करें

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

प्रदान किए गए उत्तर को निम्न गुणवत्ता पोस्ट के रूप में समीक्षा के लिए चिह्नित किया गया था। यहाँ मैं कैसे एक अच्छा जवाब लिखने के लिए कुछ दिशानिर्देश हैं ? । यह प्रदान किया गया उत्तर एक स्पष्टीकरण से लाभान्वित हो सकता है। कोड केवल उत्तरों को "अच्छा" उत्तर नहीं माना जाता है। से समीक्षा
Trenton McKinney
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.