Próbuję porównać datę w formacie String z datą bieżącą. Tak to zrobiłem (nie testowałem, ale powinno działać), ale używam przestarzałych metod. Jakieś dobre sugestie dotyczące alternatywy? Dzięki.
PS Naprawdę nienawidzę robić randek w Javie. Jest tak wiele sposobów na zrobienie tego samego, że naprawdę nie jesteś pewien, który z nich jest właściwy, stąd moje pytanie.
String valid_until = "1/1/1990";
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);
int year = strDate.getYear(); // this is deprecated
int month = strDate.getMonth() // this is deprecated
int day = strDate.getDay(); // this is deprecated
Calendar validDate = Calendar.getInstance();
validDate.set(year, month, day);
Calendar currentDate = Calendar.getInstance();
if (currentDate.after(validDate)) {
catalog_outdated = 1;
}
Calendar
,SimpleDateFormat
,Date
lub którykolwiek z pozostałych długich przestarzałych klas daty i czasu Java. Zamiast tego użyjjava.time
nowoczesnego API daty i czasu Java . Tak, możesz go używać na Androidzie. W przypadku starszego Androida zobacz Jak używać ThreeTenABP w Android Project .Odpowiedzi:
Twój kod może zostać zredukowany do
lub
źródło
Możesz użyć compareTo ()
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz Legacy, wyparta przez java.time klas. Większość funkcji java.time jest przenoszona z powrotem do Java 6 i Java 7 w projekcie ThreeTen-Backport . Dalsze dostosowanie do wcześniejszego Androida (<26) w ThreeTenABP . Zobacz Jak używać ThreeTenABP… .Możesz bezpośrednio utworzyć
Calendar
zDate
:źródło
Zauważ, że właściwy format to („dd / MM / rrrr”), zanim kod zadziała. „mm” oznacza minuty!
źródło
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz Legacy, wyparta przez java.time klas. Większość funkcji java.time jest przenoszona z powrotem do Java 6 i Java 7 w projekcie ThreeTen-Backport . Dalsze dostosowanie do wcześniejszego Androida (<26) w ThreeTenABP . Zobacz Jak używać ThreeTenABP… .zwraca prawdę .. i możesz również sprawdzić przed i równe za pomocą date.before i date.equal ..
źródło
Porównuje czas reprezentowany przez ten kalendarz z czasem reprezentowanym przez dany kalendarz.
Zwraca 0, jeśli czasy dwóch Kalendarzy są równe, -1, jeśli czas w tym kalendarzu jest wcześniejszy niż inny, 1, jeśli czas w tym kalendarzu jest po drugim.
źródło
przekonwertuj datę na kalendarz i wykonaj tam obliczenia. :)
Lub:
źródło
Czas na nowoczesną odpowiedź.
java.time i ThreeTenABP
Kiedy właśnie uruchomiłem ten kod, wynik wyglądał następująco:
Ponieważ nigdy nie jest to ta sama data we wszystkich strefach czasowych, podaj wyraźną strefę czasową na
LocalDate.now
. Jeśli chcesz, aby katalog wygasał w tym samym czasie we wszystkich strefach czasowych, możesz podać,ZoneOffset.UTC
o ile poinformujesz użytkowników, że korzystasz z UTC.Używam java.time, nowoczesnego API daty i czasu Java. Klasy data-czas, że używany
Calendar
,SimpleDateFormat
iDate
, są źle zaprojektowane i na szczęście dawno nieaktualne. Również pomimo nazwy aDate
nie oznacza daty, ale punkt w czasie. Jedną z konsekwencji tego jest: chociaż dzisiaj jest 15 lutego 2019 r., Nowo utworzonyDate
obiekt jest już po (a więc nie równy)Date
obiektowi z parsowania15/02/2019
. To dezorientuje niektórych. W przeciwieństwie do tego współczesnaLocalDate
data to data bez pory dnia (i bez strefy czasowej), więc dwieLocalDate
s reprezentujące dzisiejszą datę zawsze będą równe.Pytanie: Czy mogę używać java.time na Androidzie?
Tak, java.time działa dobrze na starszych i nowszych urządzeniach z Androidem. Wymaga tylko co najmniej Javy 6 .
org.threeten.bp
z podpakietami.Spinki do mankietów
java.time
zostało po raz pierwszy opisane.java.time
Java 6 i 7 (ThreeTen dla JSR-310).źródło
Możesz tego spróbować
i możesz użyć
today.getTime()
do pobrania wartości i porównania.źródło
Czasami musimy zrobić listę z datami, na przykład
dzisiaj z godz
wczoraj z wczoraj
inne dni z 23.06.2017
Aby to zrobić, musimy porównać aktualny czas z naszymi danymi.
Możesz również sprawdzić ten przykład w GitHub i ten post .
źródło
Aktualizacja: Joda-Time biblioteka jest teraz w trybie konserwacji i zaleca migracji do java.time ramy, które ma je zastąpić. Zobacz odpowiedź Ole VV .
Joda-Time
Klasy java.util.Date i .Calendar są notorycznie kłopotliwe. Unikaj ich. Użyj Joda-Time lub nowego pakietu java.time w Javie 8.
LocalDate
Jeśli chcesz, aby tylko data nie zawierała godziny, użyj klasy LocalDate.
Strefa czasowa
Uzyskanie aktualnej daty zależy od strefy czasowej. W Paryżu przed Montrealem nadchodzi nowy termin. Określ żądaną strefę czasową zamiast zależeć od domyślnej maszyny JVM.
Przykład w Joda-Time 2.3.
źródło
Możesz użyć validDate.setTime (strDate). Zajrzyj do javadoc pod adresem http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
źródło
źródło
W Kotlinie możesz łatwo porównać daty z operatorami porównywania. Ponieważ Kotlin już obsługuje przeciążenia operatorów. Aby porównać obiekty daty:
a jeśli używasz obiektów kalendarza, możesz łatwo porównać w ten sposób:
źródło