Cách tốt nhất để so sánh ngày trong Android


102

Tôi đang cố gắng so sánh một ngày ở định dạng Chuỗi với ngày hiện tại. Đây là cách tôi đã làm (chưa thử nghiệm, nhưng sẽ hoạt động), nhưng đang sử dụng các phương pháp không được dùng nữa. Bất kỳ đề xuất tốt cho một thay thế? Cảm ơn.

Tái bút Tôi thực sự ghét làm những thứ về Ngày tháng trong Java. Có rất nhiều cách để làm điều tương tự, đến nỗi bạn thực sự không chắc cách nào là đúng, do đó câu hỏi của tôi ở đây.

String valid_until = "1/1/1990";

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

int year = strDate.getYear(); // this is deprecated
int month = strDate.getMonth() // this is deprecated
int day = strDate.getDay(); // this is deprecated       

Calendar validDate = Calendar.getInstance();
validDate.set(year, month, day);

Calendar currentDate = Calendar.getInstance();

if (currentDate.after(validDate)) {
    catalog_outdated = 1;
}

4
Vào năm 2018 là cách tốt nhất không liên quan Calendar, SimpleDateFormat, Datehoặc bất kỳ ngày Java và thời gian lớp lạc hậu dài khác. Thay vào đó java.time, hãy sử dụng API ngày và giờ của Java hiện đại . Có, bạn có thể sử dụng nó trên Android. Đối với Android cũ hơn, hãy xem Cách sử dụng ThreeTenABP trong Android Project .
Ole VV

Câu trả lời:


219

Mã của bạn có thể được giảm xuống

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

hoặc là

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (System.currentTimeMillis() > strDate.getTime()) {
    catalog_outdated = 1;
}

nó hoạt động chắc chắn, tôi đã đăng giải pháp tương tự trong chủ đề khác nhưng không phải ở đây vì đồng nghiệp đã nhanh hơn O_o.
Simon Dorociak

chỉ muốn chắc chắn, trước khi chấp nhận. cảm ơn. nó hoạt động hoàn hảo, ngắn gọn và đơn giản như mong muốn.
nunos

16
Tôi nghĩ rằng nên sử dụng định dạng dd / MM / yyyy thay vì dd / mm / yyyy, vì "m" có nghĩa là phút và "M" có nghĩa là tháng.
Demwis

Sẽ tốt hơn nếu sử dụng phương thức CompareTo ()?
lớp học Android

25

Bạn có thể sử dụng CompareTo ()

Phương thức CompareTo phải trả về số âm nếu đối tượng hiện tại nhỏ hơn đối tượng khác, số dương nếu đối tượng hiện tại lớn hơn đối tượng khác và bằng 0 nếu cả hai đối tượng bằng nhau.

// Get Current Date Time
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm aa");
String getCurrentDateTime = sdf.format(c.getTime());
String getMyTime="05/19/2016 09:45 PM ";
Log.d("getCurrentDateTime",getCurrentDateTime); 
// getCurrentDateTime: 05/23/2016 18:49 PM

if (getCurrentDateTime.compareTo(getMyTime) < 0)
{

}
else
{
 Log.d("Return","getMyTime older than getCurrentDateTime "); 
}

1
FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản, thay thế bởi sự java.time lớp. Hầu hết chức năng java.time được chuyển ngược sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Được điều chỉnh thêm cho Android trước đó (<26) trong ThreeTenABP . Xem Cách sử dụng ThreeTenABP… .
Basil Bourque

10

Bạn có thể trực tiếp tạo một Calendartừ Date:

Calendar validDate = new GregorianCalendar();
validDate.setTime(strDate);
if (Calendar.getInstance().after(validDate)) {
    catalog_outdated = 1;
}

10

Lưu ý rằng định dạng đúng là ("dd / MM / yyyy") trước khi mã hoạt động. "mm" có nghĩa là minuts!

String valid_until = "01/07/2013";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = null;
try {
    strDate = sdf.parse(valid_until);
} catch (ParseException e) {
    e.printStackTrace();
}
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

7
Calendar toDayCalendar = Calendar.getInstance();
Date date1 = toDayCalendar.getTime();


Calendar tomorrowCalendar = Calendar.getInstance();
tomorrowCalendar.add(Calendar.DAY_OF_MONTH,1);
Date date2 = tomorrowCalendar.getTime();

// date1 is a present date and date2 is tomorrow date

if ( date1.compareTo(date2) < 0 ) {

  //  0 comes when two date are same,
  //  1 comes when date1 is higher then date2
  // -1 comes when date1 is lower then date2

 }

FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản, thay thế bởi sự java.time lớp. Hầu hết chức năng java.time được chuyển ngược sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Được điều chỉnh thêm cho Android trước đó (<26) trong ThreeTenABP . Xem Cách sử dụng ThreeTenABP… .
Basil Bourque

6
String date = "03/26/2012 11:00:00";
    String dateafter = "03/26/2012 11:59:00";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "MM/dd/yyyy hh:mm:ss");
    Date convertedDate = new Date();
    Date convertedDate2 = new Date();
    try {
        convertedDate = dateFormat.parse(date);
        convertedDate2 = dateFormat.parse(dateafter);
        if (convertedDate2.after(convertedDate)) {
            txtView.setText("true");
        } else {
            txtView.setText("false");
        }
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

nó trả về true .. và bạn cũng có thể kiểm tra trước và bằng với sự trợ giúp của date.before và date.equal ..


3
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.getDefault());
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();

Date date1 = dateFormat.parse("2013-01-01");
Date date2 = dateFormat.parse("2013-01-02");

calendar1.setTime(date1);
calendar2.setTime(date2);

System.out.println("Compare Result : " + calendar2.compareTo(calendar1));
System.out.println("Compare Result : " + calendar1.compareTo(calendar2));

So sánh thời gian được thể hiện bởi Lịch này với thời gian được biểu thị bởi Lịch đã cho.

Trả về 0 nếu thời gian của hai Lịch bằng nhau, -1 nếu thời gian của Lịch này trước Lịch kia, 1 nếu thời gian của Lịch này sau Lịch kia.


1
Cảm ơn .. Nó giúp tôi.
pRaNaY

2

chuyển đổi ngày sang Lịch và thực hiện các phép tính của bạn ở đó. :)

Calendar cal = Calendar.getInstance();
cal.setTime(date);

int year = cal.get(Calendar.YEAR);
int month = cal.geT(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH); //same as cal.get(Calendar.DATE)

Hoặc là:

SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

if (strDate.after(new Date()) {
    catalog_outdated = 1;
}

2

Đã đến lúc cho câu trả lời hiện đại.

java.time và ThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");
    String validUntil = "1/1/1990";
    LocalDate validDate = LocalDate.parse(validUntil, dateFormatter);
    LocalDate currentDate = LocalDate.now(ZoneId.of("Pacific/Efate"));
    if (currentDate.isAfter(validDate)) {
        System.out.println("Catalog is outdated");
    }

Khi tôi chạy mã này ngay bây giờ, đầu ra là:

Danh mục đã lỗi thời

Vì nó không bao giờ trùng ngày trong tất cả các múi giờ, hãy cung cấp múi giờ rõ ràng cho LocalDate.now. Nếu bạn muốn danh mục hết hạn đồng thời ở tất cả các múi giờ, bạn có thể cung cấp ZoneOffset.UTCmiễn là bạn thông báo cho người dùng rằng bạn đang sử dụng UTC.

Tôi đang sử dụng java.time, API ngày giờ hiện đại của Java. Các lớp ngày thời gian mà bạn sử dụng, Calendar, SimpleDateFormatDate, tất cả đều được thiết kế kém và may mắn thay lâu lỗi thời. Ngoài ra, mặc dù tên a Datekhông đại diện cho ngày tháng, mà là một thời điểm. Một hệ quả của điều này là: mặc dù hôm nay là ngày 15 tháng 2 năm 2019, một Dateđối tượng mới được tạo đã đứng sau (không bằng) một Dateđối tượng từ quá trình phân tích cú pháp 15/02/2019. Điều này khiến một số người bối rối. Trái ngược với điều này, ngày hiện đại LocalDatelà ngày không có thời gian trong ngày (và không có múi giờ), vì vậy hai chữ cái LocalDateđại diện cho ngày hôm nay sẽ luôn bằng nhau.

Câu hỏi: Tôi có thể sử dụng java.time trên Android không?

Có, java.time hoạt động tốt trên các thiết bị Android cũ hơn và mới hơn. Nó chỉ yêu cầu ít nhất Java 6 .

  • Trong Java 8 trở lên và trên các thiết bị Android mới hơn (từ API cấp 26), API hiện đại được tích hợp sẵn.
  • Trong Java 6 và 7, hãy lấy ThreeTen Backport, backport của các lớp hiện đại (ThreeTen cho JSR 310; xem các liên kết ở dưới cùng).
  • Trên Android (cũ hơn) sử dụng phiên bản Android của ThreeTen Backport. Nó được gọi là ThreeTenABP. Và đảm bảo rằng bạn nhập các lớp ngày và giờ từ org.threeten.bpvới các gói con.

Liên kết


1

Bạn có thể thử cái này

Calendar today = Calendar.getInstance (); 
today.add(Calendar.DAY_OF_YEAR, 0); 
today.set(Calendar.HOUR_OF_DAY, hrs); 
today.set(Calendar.MINUTE, mins ); 
today.set(Calendar.SECOND, 0); 

và bạn có thể sử dụng today.getTime()để truy xuất giá trị và so sánh.


1

Đôi khi chúng ta cần lập một danh sách với ngày tháng, như

hôm nay với giờ

hôm qua với hôm qua

các ngày khác với 23/06/2017

Để thực hiện điều này, chúng tôi cần so sánh thời gian hiện tại với dữ liệu của chúng tôi.

Public class DateUtil {

    Public static int getDateDayOfMonth (Date date) {
        Calendar calendar = Calendar.getInstance ();
        Calendar.setTime (date);
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static int getCurrentDayOfMonth () {
        Calendar calendar = Calendar.getInstance ();
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static String convertMillisSecondsToHourString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("HH: mm");
        Return formatter.format (date);
    }

    Public static String convertMillisSecondsToDateString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("dd / MM / yyyy");
        Return formatter.format (date);
    }

    Public static long convertToMillisSecond (Date date) {
        Return date.getTime ();
    }

    Public static String compare (String stringData, String yesterday) {

        String result = "";

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss");
        Date date = null;

        Try {
            Date = simpleDateFormat.parse (stringData);
        } Catch (ParseException e) {
            E.printStackTrace ();
        }

        Long millisSecond = convertToMillisSecond (date);
        Long currencyMillisSecond = System.currentTimeMillis ();

        If (currencyMillisSecond> millisSecond) {
            Long diff = currencyMillisSecond - millisSecond;
            Long day = 86400000L;

            If (diff <day && getCurrentDayOfMonth () == getDateDayOfMonth (date)) {
                Result = convertMillisSecondsToHourString (millisSecond);

            } Else if (diff <(day * 2) && getCurrentDayOfMonth () -1 == getDateDayOfMonth (date)) {
                Result = yesterday;
            } Else {
                Result = convertMillisSecondsToDateString (millisSecond);
            }
        }

        Return result;
    }
}

Ngoài ra, bạn có thể kiểm tra ví dụ này trong GitHubbài đăng này .


1

Cập nhật: Các Joda thời gian thư viện hiện đang ở bảo trì-mode, và khuyên nên chuyển sang các java.time khuôn khổ đó thành công nó. Xem câu trả lời của Ole VV .


Joda-Time

Các lớp java.util.Date và .Calendar nổi tiếng là rắc rối. Tránh chúng. Sử dụng Joda-Time hoặc gói java.time mới trong Java 8.

LocalDate

Nếu bạn muốn chỉ ngày mà không có thời gian trong ngày, thì hãy sử dụng lớp LocalDate.

Múi giờ

Việc lấy ngày hiện tại phụ thuộc vào múi giờ. Một ngày mới bắt đầu ở Paris trước Montréal. Chỉ định múi giờ mong muốn thay vì phụ thuộc vào mặc định của JVM.

Ví dụ trong Joda-Time 2.3.

DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( "1/1/1990" );
boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate );


0
SimpleDateFormat sdf=new SimpleDateFormat("d/MM/yyyy");
Date date=null;
Date date1=null;
try {
       date=sdf.parse(startDate);
       date1=sdf.parse(endDate);
    }  catch (ParseException e) {
              e.printStackTrace();
    }
if (date1.after(date) && date1.equals(date)) {
//..do your work..//
}

0

Kotlin hỗ trợ nạp chồng toán tử

Trong Kotlin, bạn có thể dễ dàng so sánh ngày tháng với các toán tử so sánh. Vì Kotlin đã hỗ trợ nạp chồng toán tử. Vì vậy, để so sánh các đối tượng ngày:

firstDate: Date = // your first date
secondDate: Date = // your second date

if(firstDate < secondDate){
// fist date is before second date
}

và nếu bạn đang sử dụng các đối tượng lịch, bạn có thể dễ dàng so sánh như sau:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
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.