Termin przydatności - porównywanie daty w Javie

0

Szukałem wszędzie odpowiedzi na swoje pytanie, ale nigdzie nie znalazłem dokładnie takiego problemu jaki mam ja. Problem wygląda tak:
*int dniPrzydatnosci = 21; - termin przydatnosci w dniach
*Metodę załadunek, która podczas wywołania ustala termin przydatności (oczywiście do czasu pakowania dodaje 21 dni)
Metoda załadunek wywołuje metodę setPrzydatnosc.
*Potrzebuję stworzyć metodę sprawdzPrzydatnosc, która zwroci true/false jezeli produkt jest zdatny lub tez nie

Wymyśliłem coś takiego:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Kontener {
	private Cukierek ladunek;
	private double masaLadunku;
	private String terminWaznosci;
	/* Pole dniPrzydatności jest przypisywane
	 * indywidualnie podczas fabrykowania cukierka
	 */
	
	public Kontener(int masaLadunku){
		this.masaLadunku = masaLadunku;
	}
	public void setPrzydatnosc(){
		
		/* Pobieranie dzisiejszej daty
		 * oraz dodanie do niej wartości
		 * zmiennej dniPrzydatnosci
		 * po czym zwrocenie daty
		 * końca przydatności cukierków
		 */
		
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		Calendar c = Calendar.getInstance();
		c.setTime(new Date());
		c.add(Calendar.DATE, ladunek.dniPrzydatnosci);
		this.terminWaznosci = simpleDateFormat.format(c.getTime());
	}
	public void zaladuj(int rodzaj){
		if(Fabryka.cukierki[rodzaj].waga<=masaLadunku){
		ladunek = Fabryka.cukierki[rodzaj];
		setPrzydatnosc();
		}else{
			System.out.println("Kontener nie jest w stanie pomieścić takiej ilości ładunku!");
		}
	}
	public boolean sprawdzPrzydatnosc(){
		boolean zdatne = true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Calendar c = Calendar.getInstance();
		c.setTime(new Date());
		if(terminWaznosci.compareTo(c.toString())>0)
			zdatne = false;
		return zdatne;
	}
}

Tylko, że wcześniej zrobiłem to troszkę inaczej strikte działając na dwóch Stringach data = " San 20 1423 CTE 2014" i porównując je. Zwrócono mi uwagę, że gdy chociaż jeden znak bd się różnił no to zmienia sens wszystkiego. Teraz moje pytanie jest takie, czy gdy zrobiłem to w sposób w/w jest w porządku? Bo defacto do znaków dostępu nie mam, tylko działam na tym co jest "generowane".

Oczywiście, jeżeli ktoś jest w stanie zaproponować "bardziej eleganckie" rozwiązanie będę bardzo wdzięczny, no i w miarę możliwości proszę o słowo komentarza, co się dzieje w ewentualnym kodzie.

0

Dlaczego terminWaznosci nie zapisujesz jako Calendar? Spróbuj tak to przerobić.

0

możesz korzystać z Java8 albo JodaTime? ten kod jest trochę lipny

trzymasz termin przydatność jako java.util.Date a do sprawdzania używasz if(terminPrzydatnosci.before(new Date())) {itd... lub lepiej

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
return fmt.format(date1).equals(fmt.format(date2));
1

Użyj LocalDate:

LocalDate zaladunek = LocalDate.of(2014,12,1);       
LocalDate dataPrzydatnosci = zaladunek.plusDays(21L);
LocalDate dzis = LocalDate.now();                    
if(dzis.isAfter(dataPrzydatnosci)){                  
	//...                                            
}

Klasa ta pochodzi z Javy 8, ale dla starszych wersji można wziąć bibliotekę JodaTime.

0

Dzięki bardzo za odpowiedzi, a zwłaszcza za pomysł z LocalDate

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