Лучший способ сравнить даты в Android
Я пытаюсь сравнить дату в строковом формате на текущую дату. Вот как я это сделал (не тестировал, но должен работать), но использую устаревшие методы. Любое хорошее предложение для альтернативы? Спасибо.
P. S. Я действительно ненавижу свидания в Java. Есть так много способов сделать то же самое, что вы действительно не уверены, какой из них правильный, поэтому мой вопрос здесь.
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;
}
12 ответов:
ваш код может быть уменьшена до
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date strDate = sdf.parse(valid_until); if (new Date().after(strDate)) { catalog_outdated = 1; }
или
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date strDate = sdf.parse(valid_until); if (System.currentTimeMillis() > strDate.getTime()) { catalog_outdated = 1; }
вы можете непосредственно создать
Calendar
СDate
:Calendar validDate = new GregorianCalendar(); validDate.setTime(strDate); if (Calendar.getInstance().after(validDate)) { catalog_outdated = 1; }
можно использовать compareTo ()
метод CompareTo должен возвращать отрицательное число, если текущий объект меньше чем другой объект, положительное число, если текущий объект больше другой объект и ноль, если оба объекта равны друг другу.
// 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 "); }
обратите внимание, что правильный формат ("dd/MM/yyyy"), прежде чем код работает. "мм" означает минуты !
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; }
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 }
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(); }
он возвращает true.. и вы также можете проверить ДО и равный с помощью даты.до и дата.равный..
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));
сравнивает время, представленное этим календарем, с временем, представленным данным календарем.
возвращает 0 Если времена двух календарей равны, -1 если время этого календаря перед другим, 1 если время этого календаря после другого.
вы могли бы попробовать это
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);
и вы могли бы использовать
today.getTime()
для получения значения и сравнения.
преобразовать дату в календарь и делать там свои расчеты. :)
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)
или:
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy"); Date strDate = sdf.parse(valid_until); if (strDate.after(new Date()) { catalog_outdated = 1; }
иногда нам нужно сделать список с датами, как
сегодня с час
вчера со вчерашнего дня
другие дни с 23/06/2017
для этого нам нужно сравнить текущее время с нашими данными.
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; } }
можно использовать validDate.setTime(strDate) Взгляните на javadoc в http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
Joda-Time
java.утиль.Сроки и. Календарные классы, как известно, хлопотно. Избегать их. Использовать Joda Времени или новая java.пакет времени в Java 8.
LocalDate
Если вы хотите только дату без времени суток, то используйте класс LocalDate.
Часовой Пояс
получение текущей даты зависит от часового пояса. Новая дата переворачивается в Париже перед Монреалем. Указать нужный часовой пояс, а не зависит от значения по умолчанию JVM.
пример в 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 );