2016-09-29 2 views
-1

Я хочу, чтобы сравнить две даты категории Браузер истории ... Я видел слишком много сообщений, но не получили какой-либо полезной,Невозможно сравнить две даты в андроида

Мой код как:

private static String calculateDate() 
{ 
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DAY_OF_YEAR, -10); 
    return simpleDateFormat.format(new Date(calendar.getTimeInMillis())); 
} 
private static String today() 
{ 
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DAY_OF_YEAR,0); 
    return simpleDateFormat.format(new Date(calendar.getTimeInMillis())); 
} 

public void getBHistory() 
{ 
    long startdates = 0; 
    long enddates = 0; 
    Date endDate = null; 
    Date startDate=null; 

    try 
    { 
     startDate = (Date)new SimpleDateFormat("yyyy-MM-dd") 
       .parse(calculateDate()); 
     endDate = (Date)new SimpleDateFormat("yyyy-MM-dd") 
       .parse(today()); 
     startdates = startDate.getTime(); 
     enddates = endDate.getTime(); 
    } catch (ParseException e) 
    { 
     e.printStackTrace(); 
    } 

    // 0 = history, 1 = bookmark 
    String sel = Browser.BookmarkColumns.BOOKMARK + " = 0" + " AND " 
      + Browser.BookmarkColumns.DATE + " BETWEEN ? AND ?"; 
    Cursor mCur = m_oContext.getContentResolver().query(Browser.BOOKMARKS_URI, Browser.HISTORY_PROJECTION, sel, 
      new String[]{ 
        "" + startdates, "" + enddates 
      }, null); 
    mCur.moveToFirst(); 
    String title = ""; 
    String date_time = ""; 
    if (mCur.moveToFirst() && mCur.getCount() > 0) 
    { 
     while (!mCur.isAfterLast()) 
     { 

      title = mCur.getString(mCur 
        .getColumnIndex(Browser.BookmarkColumns.TITLE)); 
      date_time = mCur.getString(mCur 
        .getColumnIndex(Browser.BookmarkColumns.DATE)); 
      SimpleDateFormat simpleDate= new SimpleDateFormat("yyyy-MM-dd"); 
      String curDate=simpleDate.format(new Date(Long.parseLong(date_time))); 

      Toast.makeText(m_oContext,"History Time : "+curDate,Toast.LENGTH_SHORT).show(); 
      Toast.makeText(m_oContext,"Limit Time : "+calculateDate(),Toast.LENGTH_SHORT).show(); 
      //TODO: Compare these two dates here 

      mCur.moveToNext(); 
     } 
    } 

} 

Я хочу сделать, если дата истории была раньше, чем десять дней назад, а затем уведомить пользователя. Любая помощь будет оценена, спасибо.

+0

Рад видеть вас присоединиться к переполнению стека. Когда вы размещаете здесь, сделайте так, чтобы ваш вопрос фокусировался на одном узком вопросе. Вместо того, чтобы вставлять весь ваш реальный код, разделите его на абсолютный минимум, чтобы продемонстрировать свою проблему. Сделайте [MCVE - минимальный, полный и проверенный пример] (https://stackoverflow.com/help/mcve). –

ответ

0

Календарь сопоставим, поэтому вы можете просто сравнить. Я бы сделал curDate календарем. Тогда (curDate.compareTo(calculatedDate) < 0) будет истинным, если curDate раньше, чем calculateDate, который вы установили за десять дней до сегодняшнего дня.

+0

Календарь cal1 = Calendar.getInstance(); Календарь cal2 = Calendar.getInstance(); попробуйте { cal1.setTime (simpleDate.parse (curDate)); } catch (ParseException e) { e.printStackTrace(); } попробуйте { cal2.setTime (simpleDate.parse (расчетDate())); } catch (ParseException e) { e.printStackTrace(); } if (cal1.compareTo (cal2) <0) {Toast.makeText (m_oContext, "Notify", Toast.LENGTH_SHORT) .show(); } – sam

+0

Пробовал, что ничего не происходит – sam

+0

Что вы имеете в виду, ничего не происходит? Если ваша дата равна или после расчетной даты, оператор if будет ложным. – Ben

0

Вы можете использовать до() Или после() , чтобы сравнить рассчитанную дату с текущей датой

+0

Календарь cal1 = Calendar.getInstance(); Календарь cal2 = Calendar.getInstance(); попробуйте { cal1.setTime (simpleDate.parse (curDate)); cal2.setTime (простойDate.синтаксический анализ (calculateDate())); } catch (ParseException e) { e.printStackTrace(); } if (cal1.before (cal2)) { Toast.makeText (m_oContext, "Notify", Toast.LENGTH_SHORT) .show(); } – sam

+0

ничего не происходит – sam

+0

Пожалуйста, обратитесь к этому сообщению, если вы получите какую-либо помощь, пожалуйста, обновите http://stackoverflow.com/questions/6537535/check-date-with-todays-date – Developer

0
public boolean isHDateEarlier(String historyDate){ 

     String[] historySplitStrings= historyDate.split("-"); 
     String[] tenDaysEarlierStrings = calculateDate().split("-"); 

     int historyYear = Integer.parseInt(historySplitStrings[0]); 
     int daysYear = Integer.parseInt(tenDaysEarlierStrings [0]); 
     int historyMonth = Integer.parseInt(historySplitStrings[1]); 
     int daysMonth = Integer.parseInt(tenDaysEarlierStrings [1]); 
     int historyDay = Integer.parseInt(historySplitStrings[2]); 
     int daysDay = Integer.parseInt(tenDaysEarlierStrings [2]); 


if(historyYear < daysYear){//check year 
     return true; 
} 

    if(historyMonth < daysMonth &&  
      historyYear <= daysYear){//check month 
      return true; 
    } 



    if(historyDay < daysDay && 
     historyYear <= daysYear && 
     historyMonth <= daysMonth){//check day 
      return true; 
    } 

return false; 
} 

Просто позвоните:

isHDateEarlier(curDate); 
+0

как мы можем применить <оператор к строке – sam

+0

@ Сам жаль мою ошибку, забыл разобрать их как int. – Lazai

+0

В этом случае дата падает до curDate – sam

-1

У меня была проблема с сравнивающих датами неделю назад, и искал ответы, и это помогло мне: Find nearest date from a list. - Последний ответ говорит о NavigableSet<>

Попробуйте использовать NavigableSet<Date>, например TreeSet<>, и введите ваши даты в списке. Чем сравнить с lower или higher

+0

Это очень излишне для сравнения дат. Это было бы более полезно, если вы пытаетесь выполнить поиск ближайшей даты до заданной даты. – Ben

1

ТЛ; др

Boolean alertUser = 
    LocalDate.parse("2016-01-02") 
      .isBefore( 
       LocalDate.now(ZoneId.of(“America/Montreal”)) 
          .minusDays(10) 
      ) ; 

java.time

Вы используете хлопотно старые классы даты и времени в настоящее время вытеснен классов java.time.

Часовой пояс

Ваш код игнорирует важный вопрос часового пояса при определении даты, такие как «сегодня».

Пример кода

LocalDate класс представляет собой дату только значение без времени суток и без временной зоны.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Paris France - это новый день, пока еще «вчера» в Montréal Québec.

ZoneId z = ZoneId.of(“America/Montreal”); 
LocalDate today = LocalDate.now(z); 

ваших входных строк в стандартном формате ISO 8601. Классы java.time используют форматы ISO 8601 по умолчанию при разборе/генерации строк. Поэтому нет необходимости указывать шаблон форматирования.

LocalDate target = LocalDate.parse("2016-01-02"); 

Вы говорите, что граница находится десять дней назад. Используйте методы plus или minus для определения будущих/прошлых дат.

LocalDate tenDaysAgo = today.minusDays(10); 

Сравнить с помощью compareTo, equals, isBefore и isAfter методы.

Boolean alertUser = target.isBefore(tenDaysAgo); 

О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые классы времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.

Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP (см How to use…).

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.