2012-10-10 144 views
34

Iam開發一個發送短信的應用程序。 Iam通過從數據庫中檢索時間來存儲當前時間並顯示在已發送的歷史記錄頁面中。在發送的歷史記錄頁面中,我想顯示發送消息的時間。在這裏,我想檢查消息已經發送今天或昨天或昨天之前這樣。如果郵件昨天發送意味着那麼我需要顯示「昨天20:00」那樣,甚至郵件昨天發送意味着「星期一20:00」。我不知道它是如何做的。如果有人知道,請幫助我。如何查找時間是今天或昨天在android

+0

您可以使用Java – keyser

+0

做到這一點,請展示你的代碼,你已經做了... – Goofy

+0

@Keyser你能告訴我怎麼做嗎? – Manikandan

回答

28

你可以使用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以進一步瞭解。

+11

你確定它是正確的嗎?你只比較日期,年和月呢?今天是20.11.2014,但你的代碼顯示20.10.2010 – Daryn

+2

是「今日」是@Daryn,不正確 –

+3

這個答案不正確。根據文檔,Calendar.DATE是DAY_OF_MONTH的同義詞。因此,你不是比較年份和月份。 –

0

我可以建議你一件事。當你發送短信存儲到數據庫的細節,以便你可以顯示在歷史頁​​面上發送短信的日期和時間。

+0

是iam將時間存儲在數據庫中。但我需要檢查存儲的時間是否是今天或昨天或昨天之前。 – Manikandan

+0

如果你存儲的時間。那麼爲什麼你不能存儲他的約會呢? – Goofy

+0

是的,我可以,但我需要顯示像「今天8:00」,就像在textview – Manikandan

136

要檢查,如果今天的日期是,使用Android utils的庫

DateUtils.isToday(long timeInMilliseconds) 

這utils的類還提供人類可讀的字符串相對時間。例如,

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

的幾個參數,你可以定義的時間跨度應該如何準確是

DateUtils

+4

DateUtils.isToday(myDate.getTime())工作正常,謝謝! – Loenix

+2

這是否僅消耗本地(非UTC)時間或UTC時間戳? – Matthias

+4

投票爲Android的方式沒有車輪改造! – ruX

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

你可以試試這個玩:

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

工程就像一個魅力! –

+0

完美,像魅力作品 –

20

今天,您可以使用DateUtils.isTodayandroid API

昨天您可以使用代碼:

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

@lujpo完美! – swooby

+0

上面的代碼與now.get(Calendar.MONTH)似乎返回上個月!? – Tina

0

DateUtils.isToday()應該考慮廢棄了,因爲android.text.format.Time現在已經過時。 在他們更新isToday的源代碼之前,在這裏沒有解決方案,昨天,今天檢測到處理轉換到/從夏令時轉換,並且不使用已棄用的代碼。這是在科特林,使用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,下去吧

1

投票這是獲取值的方法像今天,昨天和日期一樣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")); 
12

如前所述,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); 
} 
+0

這應該是被接受的答案。簡單易讀,且有效。唯一能讓它更有效的方法是爲毫秒時間戳寫入方法,這樣可以將它用於日曆,日期或任何你喜歡的類。 – user1806772

相關問題