Лучший способ сравнить даты в 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; }
- Процесс регистрации сертификатов
- Уровень заряда батареи и состояние в Android
- Предпочтения в списке Android: есть сводка в качестве выбранного значения?
- Android: CountDownTimer пропускает последний onTick ()!
- Динамические имена переменных Java
- Is -Djava.library.path = ... эквивалентно System.setProperty ("java.library.path", ...)
- Использовать интерфейс или тип для определения переменной в java?
- android.app.Application нельзя использовать для android.app.Activity
- Предотвратить показ веб-страницы «веб-страница недоступна»
- Невозможно получить информацию о подписке из API разработчика Google Play для Android
- источник отладки jdk не может просматривать переменную, что она
- Отправка электронной почты на Android с использованием API JavaMail без использования стандартного / встроенного приложения
- Очистка и настройка домашнего приложения по умолчанию
Ваш код может быть уменьшен до
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 );