Termin przydatności - porównywanie daty w Javie

Odpowiedz Nowy wątek
2014-12-20 14:57
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 14:58:23 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.


„Every Pro was once an amateur, every expert was once a beginner.”
edytowany 1x, ostatnio: Fi3rce, 2014-12-20 14:59

Pozostało 580 znaków

2014-12-20 15:16
0

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

Pozostało 580 znaków

2014-12-20 15:26
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));

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
edytowany 2x, ostatnio: karolinaa, 2014-12-20 16:31

Pozostało 580 znaków

2014-12-20 18:44
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.

ciekawe czy dodadzą do hibernate obsługę LocalDateTime.. - karolinaa 2014-12-20 20:06
@karolinaa, tak https://hibernate.atlassian.net/browse/HHH-8844 przy czym JPA 2.1 wyszło przed Javą 8 i jeszcze nie ma oficjalnego wsparcia out-of-box. Za to są konwertery i gotowe rozwiązania z Jadira Usertype> http://jadira.sourceforge.net/ - Koziołek 2014-12-20 22:10

Pozostało 580 znaków

2014-12-22 11:46
0

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


„Every Pro was once an amateur, every expert was once a beginner.”
Zakończ wątek, jeśli już po problemie; - furious programming 2014-12-22 19:13

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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