Android / Java - разница в датах в днях
Я получаю текущую дату (в формате 12/31/1999, т.е. мм / дд / гггг), используя приведенный ниже код:
Textview txtViewData;
txtViewDate.setText("Today is " +
android.text.format.DateFormat.getDateFormat(this).format(new Date()));
и у меня есть другая дата в формате: 2010-08-25 (т.е. гггг / мм / дд) ,
итак, я хочу найти разницу между датой в количестве дней, как мне найти разницу в днях?
(Другими словами, я хочу найти разницу между ТЕКУЩЕЙ ДАТОЙ - датой в формате гггг / мм / дд)
Переведено автоматически
Ответ 1
Не совсем надежный метод, лучше использовать JodaTime
Calendar thatDay = Calendar.getInstance();
thatDay.set(Calendar.DAY_OF_MONTH,25);
thatDay.set(Calendar.MONTH,7); // 0-11 so 1 less
thatDay.set(Calendar.YEAR, 1985);
Calendar today = Calendar.getInstance();
long diff = today.getTimeInMillis() - thatDay.getTimeInMillis(); //result in millis
Вот приблизительное значение...
long days = diff / (24 * 60 * 60 * 1000);
Чтобы проанализировать дату из строки, вы могли бы использовать
String strThatDay = "1985/08/25";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
Date d = null;
try {
d = formatter.parse(strThatDay);//catch exception
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Calendar thatDay = Calendar.getInstance();
thatDay.setTime(d); //rest is the same....
Хотя, поскольку вы уверены в формате даты...
Вы также могли бы сделать Integer.parseInt()
для его подстрок, чтобы получить их числовые значения.
Ответ 2
Это НЕ моя работа, нашел ответ здесь. не хотел, чтобы в будущем была неработающая ссылка :).
Эта строка является ключевой для учета настройки дневного света, см. полный код.
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
или попробуйте передать TimeZone
в качестве параметра в daysBetween()
и вызвать setTimeZone()
в объектах sDate
и eDate
.
Итак, вот оно:
public static Calendar getDatePart(Date date){
Calendar cal = Calendar.getInstance(); // get calendar instance
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0); // set hour to midnight
cal.set(Calendar.MINUTE, 0); // set minute in hour
cal.set(Calendar.SECOND, 0); // set second in minute
cal.set(Calendar.MILLISECOND, 0); // set millisecond in second
return cal; // return the date part
}
getDatePart() taken from here
/**
* This method also assumes endDate >= startDate
**/
public static long daysBetween(Date startDate, Date endDate) {
Calendar sDate = getDatePart(startDate);
Calendar eDate = getDatePart(endDate);
long daysBetween = 0;
while (sDate.before(eDate)) {
sDate.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
return daysBetween;
}
The Nuances:
Finding the difference between two dates isn't as straightforward as subtracting the two dates and dividing the result by (24 * 60 * 60 * 1000). Infact, its erroneous!
For example: The difference between the two dates 03/24/2007 and 03/25/2007 should be 1 day; However, using the above method, in the UK, you'll get 0 days!
Убедитесь сами (код ниже). Использование миллисекунд приведет к ошибкам округления, и они станут наиболее очевидными, как только появится такая мелочь, как переход на летнее время.
Полный код:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateTest {
public class DateTest {
static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
//diff between these 2 dates should be 1
Date d1 = new Date("01/01/2007 12:00:00");
Date d2 = new Date("01/02/2007 12:00:00");
//diff between these 2 dates should be 1
Date d3 = new Date("03/24/2007 12:00:00");
Date d4 = new Date("03/25/2007 12:00:00");
Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);
printOutput("Manual ", d1, d2, calculateDays(d1, d2));
printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
System.out.println("---");
printOutput("Manual ", d3, d4, calculateDays(d3, d4));
printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}
private static void printOutput(String type, Date d1, Date d2, long result) {
System.out.println(type+ "- Days between: " + sdf.format(d1)
+ " and " + sdf.format(d2) + " is: " + result);
}
/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/
/* This method is used to find the no of days between the given dates */
public static long calculateDays(Date dateEarly, Date dateLater) {
return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}
/** Using Calendar - THE CORRECT WAY**/
public static long daysBetween(Date startDate, Date endDate) {
...
}
ВЫВОД:
Руководство - Количество дней между: 01-Jan-2007 и 02-Jan-2007 составляет: 1
Количество календарных дней между: 01-Jan-2007 и 02-Jan-2007 составляет: 1
Руководство - Количество дней между: 24-Mar-2007 и 25-Mar-2007 равно: 0
Количество календарных дней между: 24-Mar-2007 и 25-Mar-2007 составляет: 1
Ответ 3
Большинство ответов были хорошими и подходили для вашей проблемы
итак, я хочу найти разницу между датой в количестве дней, как мне найти разницу в днях?
Я предлагаю этот очень простой и понятный подход, который гарантированно даст вам правильную разницу в любом часовом поясе:
int difference=
((int)((startDate.getTime()/(24*60*60*1000))
-(int)(endDate.getTime()/(24*60*60*1000))));
И все!
Ответ 4
Используйте jodatime API
Days.daysBetween(start.toDateMidnight() , end.toDateMidnight() ).getDays()
где 'start' и 'end' являются вашими объектами DateTime. Чтобы преобразовать ваши строки даты в объекты DateTime, используйте метод parseDateTime
Также существует специфичная для Android библиотека JodaTime.