Czy ktoś zna prosty sposób używania kalendarza Java do odejmowania X dni od daty?
Nie udało mi się znaleźć żadnej funkcji, która pozwala mi bezpośrednio odjąć X dni od daty w Javie. Czy ktoś może wskazać mi właściwy kierunek?
java
calendar
subtraction
fmsf
źródło
źródło
java.util.Calendar
teraz, są starsze , wyparte przez klasy java.time . Zobacz samouczek Oracle .Odpowiedzi:
Zaczerpnięte z dokumentów tutaj :
źródło
Calendar.DAY_OF_MONTH
w tym przypadku, ponieważ nie poradzi sobie z rolką między miesiącami, jak chcesz.Calendar.DAY_OF_YEAR
Zamiast tego użyjMożesz użyć tej
add
metody i przekazać jej liczbę ujemną. Można również napisać prostszą metodę, która nie korzysta zCalendar
klasy, taką jak poniżejPobiera wartość znacznika czasu daty (milisekund od epoki) i dodaje odpowiednią liczbę milisekund. Możesz przekazać ujemną liczbę całkowitą dla parametru dni, aby wykonać odejmowanie. Byłoby to prostsze niż „właściwe” rozwiązanie kalendarza:
Zauważ, że oba te rozwiązania zmieniają
Date
obiekt przekazywany jako parametr zamiast zwracania całkowicie nowegoDate
. Każdą funkcję można łatwo zmienić, aby zrobić to w drugą stronę, jeśli jest to pożądane.źródło
java.util.Calendar
teraz, są starsze , wyparte przez klasy java.time . Zobacz samouczek Oracle .Odpowiedź Ansona zadziała w przypadku prostego przypadku, ale jeśli zamierzasz wykonać bardziej złożone obliczenia daty, polecam sprawdzenie Jody Time . Ułatwi ci to życie.
Do Twojej wiadomości w Joda Time możesz to zrobić
źródło
tl; dr
Lepiej określić strefę czasową.
Detale
Stare klasy daty i czasu dołączone do wczesnych wersji Javy, takie jak
java.util.Date
/.Calendar
, okazały się kłopotliwe, mylące i wadliwe. Unikaj ich.java.time
Java 8 i nowsze wersje zastępują te stare klasy za pomocą nowego środowiska java.time. Zobacz samouczek . Zdefiniowany przez JSR 310 , zainspirowany Joda-Time i rozszerzony przez projekt ThreeTen-Extra . Projekt ThreeTen-Backport przenosi klasy na Java 6 i 7; projekt ThreeTenABP na Androida.
Pytanie jest niejasne, niejasne, czy wymaga tylko daty, czy daty.
LocalDate
Tylko na randkę, bez pory dnia, skorzystaj z
LocalDate
klasy. Pamiętaj, że strefa czasowa ma kluczowe znaczenie dla ustalenia daty, takiej jak „dzisiaj”.ZonedDateTime
Jeśli miałeś na myśli datę i godzinę, skorzystaj z
Instant
zajęć, aby uzyskać chwilę na osi czasu w UTC . Stamtąd dostosuj się do strefy czasowej, aby uzyskaćZonedDateTime
obiekt.O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te zastępują kłopotliwe, starsze, klasowe daty i godziny, takie jak
java.util.Date
,Calendar
, iSimpleDateFormat
.The Joda-Time , teraz w trybie konserwacji , zaleca migrację doklas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymienić java.time obiekty bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
edit: parser nie wydaje się lubić linku do Javadoc, więc tutaj jest w postaci zwykłego tekstu:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
źródło
Zamiast pisać własne,
addDays
jak sugeruje Eli, wolałbym korzystaćDateUtils
z Apache . Jest to przydatne, zwłaszcza gdy musisz użyć go w wielu miejscach w swoim projekcie.Interfejs API mówi:
addDays(Date date, int amount)
Dodaje liczbę dni do daty zwracając nowy obiekt.
Zauważ, że zwraca nowy
Date
obiekt i nie wprowadza zmian w samym poprzednim.źródło
Można to łatwo zrobić w następujący sposób
źródło
LocalDate
jest znacznie prostsze i bardziej odpowiednie.Ktoś polecił Joda Time, więc - korzystałem z tej klasy CalendarDate http://calendardate.sourceforge.net
Jest to nieco konkurencyjny projekt do Jody Time, ale o wiele bardziej podstawowy na zaledwie 2 lekcjach. Jest bardzo poręczny i działał świetnie dla tego, czego potrzebowałem, ponieważ nie chciałem używać pakietu większego niż mój projekt. W przeciwieństwie do odpowiedników w Javie, najmniejszą jednostką jest dzień, więc jest to naprawdę data (nie sprowadzająca się do milisekund lub czegoś takiego). Po utworzeniu daty wszystko, co musisz zrobić, to odjąć coś w rodzaju myDay.addDays (-5), aby cofnąć się o 5 dni. Możesz go użyć, aby znaleźć dzień tygodnia i podobne rzeczy. Inny przykład:
I:
źródło
Uważam, że czysty i przyjemny sposób na odejmowanie lub dodawanie dowolnej jednostki czasu (miesiące, dni, godziny, minuty, sekundy, ...) można osiągnąć za pomocą klasy java.time.Instant .
Przykład odejmowania 5 dni od bieżącej godziny i uzyskiwania wyniku jako Data:
Kolejny przykład odejmowania 1 godziny i dodawania 15 minut:
Jeśli potrzebujesz większej dokładności, Instancja mierzy do nanosekund. Metody manipulowania częścią nanosekundową:
Pamiętaj też, że data nie jest tak dokładna jak błyskawiczna.
źródło
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Drugie rozwiązanie Eli Courtwright jest złe, powinno być:
źródło
addDays
; jego rozwiązanie jest poprawne. Jeśli chcesz odjąć dni od daty, podaj wartość ujemną dladays
.