Cách tìm thời gian là hôm nay hay hôm qua trong Android


87

Tôi đang phát triển một ứng dụng để gửi sms. Tôi đang lưu trữ thời gian hiện tại và hiển thị trong trang lịch sử đã gửi bằng cách truy xuất thời gian từ cơ sở dữ liệu. Trong trang lịch sử đã gửi, tôi muốn hiển thị thời gian tin nhắn được gửi. Ở đây tôi muốn kiểm tra xem tin nhắn đã được gửi hôm nay hay hôm qua hoặc ngày hôm qua trước đó như thế nào. Nếu tin nhắn được gửi ngày hôm qua có nghĩa là tôi cần hiển thị "Ngày hôm qua 20:00" như vậy và thậm chí tin nhắn đã được gửi hôm qua trước đó có nghĩa là "20:00 thứ Hai". Tôi không biết nó phải được thực hiện như thế nào. Xin hãy giúp tôi nếu ai đó biết.


vui lòng hiển thị mã của bạn mà bạn đã thực hiện ...
Goofy

@Keyser Bạn có thể cho tôi biết cách làm được không?
Manikandan

2
Vì bạn chưa thử bất kỳ mã nào nên bạn không biết mình cần trợ giúp gì. Đặt một câu hỏi là quá sớm. Chờ cho đến khi bạn thấy những gì mang lại cho bạn rắc rối.
David Schwartz

bất cứ khi nào bạn lấy dữ liệu từ cơ sở dữ liệu, lấy thời gian cuối cùng của chuyển đổi trong hộp gửi
Nirav Ranpara

@ user1498488 Đơn giản chỉ cần tìm một số hướng dẫn về xử lý ngày / giờ trong Java.
đánh chìa khóa vào

Câu trả lời:


51

Bạn có thể làm điều đó dễ dàng bằng cách sử dụng lớp android.text.format.DateFormat. Hãy thử một cái gì đó như thế này.

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

Kiểm tra http://developer.android.com/reference/java/text/DateFormat.html để hiểu thêm.


21
Bạn có chắc rằng nó là chính xác? Bạn chỉ so sánh ngày tháng, còn năm và tháng thì sao? Hôm nay là ngày 21.11.2014, nhưng mã của bạn hiển thị "Hôm nay" cho ngày 20.10.2010
Daryn

3
Câu trả lời này không đúng. Theo tài liệu, Calendar.DATE là từ đồng nghĩa của DAY_OF_MONTH. Do đó bạn không được so sánh giữa năm và tháng.
Joao Sousa

Vâng, nó không chính xác. (Calendar.DATE) == smsTime.get (Calendar.DATE) chỉ khớp với ngày chứ không phải tháng và năm. nó trả về true cho 01.01.2012 và 01.01.2017
Anjum,

1
Đối với văn bản "hôm nay", lời giải này luôn đúng nhưng đối với văn bản "hôm qua" Nó không đúng trong ngày đầu tiên của tháng. Phương thức get (Calendar.DATE) trả về ngày trong tháng và ví dụ 1 - 31 = -30 thay vì 1 cái sẽ hiển thị "hôm qua" - vì ngày 31 tháng 12 là ngày trước đó của ngày 1 tháng Giêng.
lukjar

"Hôm nay" và "hôm qua" cần phải bao gồm tháng và năm trong séc, không chỉ
Lịch.DATE

242

Để kiểm tra xem ngày có phải là hôm nay hay không, hãy sử dụng thư viện Android utils

DateUtils.isToday(long timeInMilliseconds)

Lớp utils này cũng cung cấp các chuỗi có thể đọc được của con người trong thời gian tương đối. Ví dụ,

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

Một số tham số bạn có thể sử dụng để xác định khoảng thời gian chính xác như thế nào

Xem DateUtils


5
DateUtils.isToday (myDate.getTime ()) đang hoạt động tốt, cảm ơn bạn!
Loenix

4
Điều này có tốn thời gian cục bộ (không phải UTC) hay chỉ dấu thời gian UTC không?
Matthias,

5
DateUtils.isToday(long millis)hoạt động như được mô tả bởi @Maragues, nhưng hãy lưu ý rằng nếu bạn sử dụng phương pháp này trong đoạn mã mà bạn muốn kiểm tra đơn vị (như ViewModel hoặc Presenter), bạn sẽ nhận được RuntimeException khi chạy thử nghiệm của mình. Điều này là do thực tế là android.jar được sử dụng cho các bài kiểm tra đơn vị không chứa bất kỳ mã nào. Để biết thêm thông tin liên kết
Kaskasi

78

Như đã đề cập, DateUtils.isToday(d.getTime())sẽ hoạt động để xác định xem Date dcó phải là ngày hôm nay hay không. Nhưng một số câu trả lời ở đây không thực sự trả lời cách xác định một ngày có phải là ngày hôm qua hay không. Bạn cũng có thể làm điều đó dễ dàng với DateUtils:

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

Sau đó, bạn cũng có thể xác định xem một ngày có phải là ngày mai hay không:

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

Đây phải là câu trả lời được chấp nhận. Đơn giản để đọc và hiệu quả. Chỉ có cách để làm cho nó hiệu quả hơn nữa là viết các phương thức cho dấu thời gian mili, vì vậy người ta có thể sử dụng nó với Lịch, Ngày hoặc bất kỳ lớp nào bạn thích.
joe1806772

Điều đó thật tuyệt. Nhưng vì một số lý do kỳ lạ, tôi không thể sử dụng nó như một hàm mở rộng trong Kotlin như:fun DateUtils.isYesterday(d: Long): Boolean { return DateUtils.isToday(d + DateUtils.DAY_IN_MILLIS) }
Saifur Rahman Mohsin

tôi nghĩ rằng đây là giải pháp tốt nhất theo nghĩa đen là hai dòng mã nó hoàn thành công việc
Amir Dora.

22

Đối với ngày hôm nay, bạn có thể sử dụng DateUtils.isTodaytừ API android .

Đối với ngày hôm qua, bạn có thể sử dụng mã đó:

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 hoàn hảo!
swooby

Đoạn mã trên với now.get (Calendar.MONTH) dường như trả về tháng trước !?
Tina

@tina nó chỉ nên xảy ra vào ngày đầu tiên của tháng
lujop

9

Bạn có thể thử điều này:

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

7

Nếu cấp API của bạn là 26 trở lên, thì tốt hơn bạn nên sử dụng lớp 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
}

Nếu ứng dụng của bạn có cấp API thấp hơn, hãy sử dụng

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

KHÔNG sử dụng lib


Hôm qua

Hôm nay

Ngày mai

Năm nay

Bất kỳ năm nào

 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

Một cách khác để làm điều đó. Trong kotlin với lib ThreeTen được đề xuất

  1. Thêm ThreeTen

    implementation 'com.jakewharton.threetenabp:threetenabp:1.1.0'
    
  2. Thêm phần mở rộng kotlin.

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

Đây nên là con đường để đi. Phân tích cú pháp tùy chỉnh thật tệ.
XY

4

Kotlin

@Choletski giải pháp nhưng với giây và trong 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()
        }
    }

Bạn có thể chuyển qua đây date.getTime()để nhận kết quả đầu ra như

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

2

Đây là phương pháp để nhận các Giá trị như Hôm nay, Hôm qua và Ngày như ứng dụng Whtsapp có

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

Sử dụng phương pháp này chỉ cần vượt qua Millisecond như

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

Bạn đã test mã này bên mình hay tham khảo chưa?
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

tôi có thể gợi ý cho bạn một điều. Khi bạn gửi sms, hãy lưu trữ thông tin chi tiết vào cơ sở dữ liệu để bạn có thể hiển thị ngày và giờ mà sms được gửi trong trang lịch sử.


Có, tôi đang lưu trữ thời gian trong cơ sở dữ liệu. Nhưng tôi cần kiểm tra xem thời gian được lưu trữ là ngày hôm nay hay ngày hôm qua hoặc ngày hôm qua trước đó.
Manikandan

nếu bạn lưu trữ thời gian. vậy tại sao bạn không thể lưu trữ anh ta cũng hẹn hò?
Goofy

Có tôi có thể nhưng tôi cần phải chứng minh như "Hôm nay 08:00" như thế trong TextView
Manikandan

U có thể làm điều đó ... có được ngày từ Db và so sánh với ngày nay date.if nó phù hợp sau đó hiển thị một cái nhìn văn bản như "Hôm nay" nếu nó là ngày hiện tại - ngày revious sau đó hiển thị "Hôm qua"
Goofy


0

DateUtils.isToday()nên được coi là không dùng nữa vì android.text.format.Timehiện không được dùng nữa. Cho đến khi họ cập nhật mã nguồn cho isToday, không có giải pháp nào ở đây phát hiện ngày hôm nay, ngày hôm qua, xử lý các ca đến / đi từ giờ tiết kiệm ánh sáng ban ngày và không sử dụng mã không dùng nữa. Đây là trong Kotlin, sử dụng todaytrường phải được cập nhật định kỳ (ví dụ: onResumev.v.):

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

Tôi đã gửi https://code.google.com/p/android/issues/detail?id=227694&thanks=227694&ts=1479155729 , hãy bỏ phiếu cho nó


0

Đây là mã tôi đã kết thúc cho bây giờ:

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

Đây là một giải pháp đơn giản mà tôi sử dụng:

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

Điều này bao gồm tất cả các trường hợp cạnh có thể xảy ra.


-1

Không cần bất kỳ thư viện và mã đơn giản nào, hãy làm việc trên mọi dự án 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()) {
...
}

Câu trả lời được cung cấp đã được gắn cờ để xem xét là Bài đăng chất lượng thấp. Dưới đây là một số hướng dẫn về Làm cách nào để viết một câu trả lời hay? . Câu trả lời được cung cấp này có thể được hưởng lợi từ một lời giải thích. Câu trả lời chỉ có mã không được coi là câu trả lời "tốt". Từ đánh giá .
Trenton McKinney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.