[Date, Calendar] Różnica między datami

0

Witam

Mój problem polega na tym, że chciałbym zaimplementować różnicę dat w dniach (oczywiście bez dołączania dodatkowych bibliotek). Niby zadanie na rozgrzewkę, a jednak;)
Pierwsza myśl poniżej:

public static long diffInDays(Date d1, Date d2)
	{
		return (d1.getTime() - d2.getTime()) / 86400000;
	}

I niby wszystko wydaje się ok, lecz poniższe wywołanie:

	public static void main(String[] args)
	{
		Calendar c1 = Calendar.getInstance();
		Calendar c2 = Calendar.getInstance();
		
		c1.set(2008, 3, 29);
		c2.set(2008, 3, 31);
		System.out.println(diffInDays(c2.getTime(), c1.getTime()));
		
		c1.set(2008, 3, 31);
		c2.set(2008, 4, 1);
		System.out.println(diffInDays(c2.getTime(), c1.getTime()));
	}
0

Dalszy ciąg... (przypadkowo poszedł tab + enter)

Lecz ostatnie wywołanie wyświetli 0. Zauważyłem, że dzieje się wtedy gdy odejmujemy miesiące mające 31 dni od miesięcy mających ich 30 (dla sierpnie i lipca tak się nie dzieje).

Proszę o wyjaśnienie tej sytuacji

Z góry dziękuje
Pozdrawiam Kamil

0
  c1.set(2008, 3, 31); //to jest 31 kwietnia 
  c2.set(2008, 4, 1);   //to jest 1 maja

Dla mnie jest naturalne, że 31 kwietnia to 1 maja. Nie widzę zatem nic dziwnego w tym, że różnica między 1 maja a 1 maja wynosi zero.
pozdrawiam
P.S. Zgadzam się, że numerowanie miesięcy od zera jest bardzo mylące.

0

wywolak Calendar.setLenient(false) i wtedy dostaniesz blad podczas ustawiania 31. kwietnia.

0

Wielkie dzięki

0

Ostatecznie jakby ktoś kiedyś chciał napisać podobną metodę proponuję następujące rozwiązanie (różni się od powyższego tylko typem zwracanym):

public static double diffInDays2(Date d1, Date d2)
{
  return (d1.getTime() - d2.getTime()) / 86400000.0;
}

lub takie

public static long diffInDays3(Date d1, Date d2)
{
  return Math.round((d1.getTime() - d2.getTime()) / 86400000.0);
}

Ponieważ dla wywołania

public static void main(String[] args)
{
  Calendar c1 = Calendar.getInstance();
  Calendar c2 = Calendar.getInstance();
	
  c1.set(2008, 2, 29);
  c2.set(2008, 2, 31);

  System.out.println(diffInDays(c2.getTime(), c1.getTime()));

  System.out.println(diffInDays2(c2.getTime(), c1.getTime()));
  System.out.println(diffInDays3(c2.getTime(), c1.getTime()));


		
}

Otrzymamy:
1
1.9583333333333333
2

Pozdrawiam
Kamil

1 użytkowników online, w tym zalogowanych: 0, gości: 1