Лучший способ сравнить даты в Android

Я пытаюсь сравнить дату в формате String с текущей датой. Вот как я это сделал (не тестировал, но должен работать), но использую устаревшие методы. Любое хорошее предложение для альтернативы? Благодарю.

PS Я действительно ненавижу работу с датами в 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; } 

Ваш код может быть уменьшен до

 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 .. и вы также можете проверить до и равные с помощью date.before и date.equal ..

 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  

Также вы можете проверить этот пример в GitHub и этом сообщении .

Вы можете использовать validDate.setTime (strDate). Посмотрите на javadoc по адресу http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html.

Joda времени

Классы java.util.Date и .Calendar, как известно, хлопотны. Избежать их. Используйте Joda-Time или новый пакет java.time в Java 8.

LocalDate

Если вы хотите использовать дату только без времени суток, используйте class LocalDate.

Часовой пояс

Получение текущей даты зависит от часового пояса. В Париже перед Монреалем начинается новая дата. Укажите желаемый часовой пояс, а не зависеть от значения JVM по умолчанию.

Пример в Йода-время 2.3.

 DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" ); LocalDate localDate = formatter.parseLocalDate( "1/1/1990" ); boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate ); 
  • Android - Сохранить изображение с URL на SD-карту
  • Удаление объекта в java?
  • Как исправить android.os.NetworkOnMainThreadException?
  • Передача данных с помощью Serializable
  • Что такое Runtime.getRuntime (). TotalMemory () и freeMemory ()?
  • Правильный способ реализации равного контракта
  • отображение AM и PM в маленькой букве после форматирования даты
  • IllegalBlockSizeException при попытке шифрования и расшифровки строки с помощью AES
  • Печатать массив без скобок и запятых
  • Как скомпилировать пакеты в java?
  • Проверка, является ли строка пустой или пустой в Java
  • Давайте будем гением компьютера.