Остались дни Android

Мне нужно сделать CountDown Days с одной даты до второй даты

например

CURRENT_DATE:3/1/2013 NEXT_DATE:21/01/2013

Затем он отображает :: 17 DAYS LEFT

Я реализовал такой код

 String inputDateString = "01/22/2013"; Calendar calCurr = Calendar.getInstance(); Calendar calNext = Calendar.getInstance(); calNext.setTime(new Date(inputDateString)); if(calNext.after(calCurr)) { long timeDiff = calNext.getTimeInMillis() - calCurr.getTimeInMillis(); int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS); dni.setText("Days Left: "+daysLeft); } else { long timeDiff = calCurr.getTimeInMillis() - calNext.getTimeInMillis(); timeDiff = DateUtils.YEAR_IN_MILLIS - timeDiff; int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS); } 

Есть ли лучший способ добиться этого?

Использование методов Calendar :

 String inputDateString = "01/22/2013"; Calendar calCurr = Calendar.getInstance(); Calendar day = Calendar.getInstance(); day.setTime(new SimpleDateFormat("MM/dd/yyyy").parse(inputDateString)); if(day.after(calCurr)){ System.out.println("Days Left: " + (day.get(Calendar.DAY_OF_MONTH) -(calCurr.get(Calendar.DAY_OF_MONTH))) ); } 

Выход: осталось дней: 17

И чтобы увеличить год на 1, вы можете использовать метод Calendar.add ()

  day.add(Calendar.YEAR, 1); 

Существует несколько библиотек для преобразования даты в формат n days :

  • PrettyTime
  • JodaTime

Я использую этот класс

 import android.text.format.DateUtils; import java.util.Date; import static android.text.format.DateUtils.FORMAT_NUMERIC_DATE; import static android.text.format.DateUtils.FORMAT_SHOW_DATE; import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; /** * Utilities for dealing with dates and times */ public class TimeUtils { /** * Get relative time for date * * @param date * @return relative time */ public static CharSequence getRelativeTime(final Date date) { long now = System.currentTimeMillis(); if (Math.abs(now - date.getTime()) > 60000) return DateUtils.getRelativeTimeSpanString(date.getTime(), now, MINUTE_IN_MILLIS, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE); else return "Just now"; } } 

TimeUtils.getRelativeTime(date) возвращает текст как
Прямо сейчас,
2 мин. тому назад,
2 часа назад,
2 дня назад,
04.11.2013

Я искал этот код в Интернете, но не смог найти. Хотя я отвечаю поздно, это будет полезный кусок кода.

 public static String getTimeLeft(String date) { // dateFormat = "yyyy-MM-dd" String[] DateSplit = date.split("-"); int month = Integer.parseInt(DateSplit[1]) - 1, // if month is november then subtract by 1 year = Integer.parseInt(DateSplit[0]), day = Integer .parseInt(DateSplit[2]), hour = 0, minute = 0, second = 0; Calendar now = Calendar.getInstance(); int sec = second - Calendar.getInstance().get(Calendar.SECOND), min = minute - Calendar.getInstance().get(Calendar.MINUTE), hr = hour - Calendar.getInstance().get(Calendar.HOUR_OF_DAY), dy = day - Calendar.getInstance().get(Calendar.DATE), mnth = month - Calendar.getInstance().get(Calendar.MONTH), daysinmnth = 32 - dy; Calendar end = Calendar.getInstance(); end.set(year, month, day); if (mnth != 0) { if (dy != 0) { if (sec < 0) { sec = (sec + 60) % 60; min--; } if (min < 0) { min = (min + 60) % 60; hr--; } if (hr < 0) { hr = (hr + 24) % 24; dy--; } if (dy < 0) { dy = (dy + daysinmnth) % daysinmnth; mnth--; } if (mnth < 0) { mnth = (mnth + 12) % 12; } } } String hrtext = (hr == 1) ? "hour" : "hours", dytext = (dy == 1) ? "day" : "days", mnthtext = (mnth == 1) ? "month" : "months"; if (now.after(end)) { return ""; } else { String months = "", days = "", hours = ""; months = (mnth > 0) ? mnth + " " + mnthtext : ""; if (mnth <= 0) { days = (dy > 0) ? dy + " " + dytext : ""; if (dy <= 0) { hours = (hr > 0) ? hr + " " + hrtext : ""; } } //Log.d("DATE", months + " 1 " + days + " 2 " + hours); return months + days + hours; } } 

Другие ответы игнорируют часовой пояс, что может иметь решающее значение в зависимости от того, насколько точны ваши обратные отсчеты. Если вы не укажете часовой пояс, вы получите значение JVM по умолчанию.

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

Немного кода в Joda-Time 2.3, непроверенный (с верхней части моей головы). Найдите StackOverflow для многих других примеров.

 String input = "01/22/2013"; DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone ); DateTime future = formatterInput.parseDateTime( input ); DateTime now = new DateTime( timeZone ); int days = Days.daysBetween( now, future ).getDays(); Interval interval = new Interval( now, future ); Period period = new Period( interval ); 

Сделайте некоторые System.out.println вызовы для этих переменных и удивляйтесь.

Формат строки, который вы увидите, – ISO 8601 . Вы можете создавать и другие форматы.