Odpowiedzi:
Zaczerpnięte z dokumentów tutaj :
Dodaje lub odejmuje określony czas w danym polu kalendarza, zgodnie z regułami kalendarza. Na przykład, aby odjąć 5 dni od bieżącej godziny kalendarza, możesz to zrobić, dzwoniąc:
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
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żyj
Możesz użyć tej add
metody i przekazać jej liczbę ujemną. Można również napisać prostszą metodę, która nie korzysta z Calendar
klasy, taką jak poniżej
public static void addDays(Date d, int days)
{
d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}
Pobiera 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:
public static void addDays(Date d, int days)
{
Calendar c = Calendar.getInstance();
c.setTime(d);
c.add(Calendar.DATE, days);
d.setTime( c.getTime().getTime() );
}
Zauważ, że oba te rozwiązania zmieniają Date
obiekt przekazywany jako parametr zamiast zwracania całkowicie nowego Date
. Każdą funkcję można łatwo zmienić, aby zrobić to w drugą stronę, jeśli jest to pożądane.
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ć
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
LocalDate.now().minusDays( 10 )
Lepiej określić strefę czasową.
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
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 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”.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
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.
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te zastępują kłopotliwe, starsze, klasowe daty i godziny, takie jakjava.util.Date
, Calendar
, i SimpleDateFormat
.
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 .
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);
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)
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.
Można to łatwo zrobić w następujący sposób
Calendar calendar = Calendar.getInstance();
// from current time
long curTimeInMills = new Date().getTime();
long timeInMills = curTimeInMills - 5 * (24*60*60*1000); // `enter code here`subtract like 5 days
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
// from specific time like (08 05 2015)
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.MONTH, (5-1));
calendar.set(Calendar.YEAR, 2015);
timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
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:
CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);
I:
//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
dayLabel = cdf.format(currDay);
if (currDay.equals(today))
dayLabel = "Today";//print "Today" instead of the weekday name
System.out.println(dayLabel);
currDay = currDay.addDays(1);//go to next day
}
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:
new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());
Kolejny przykład odejmowania 1 godziny i dodawania 15 minut:
Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));
Jeśli potrzebujesz większej dokładności, Instancja mierzy do nanosekund. Metody manipulowania częścią nanosekundową:
minusNano()
plusNano()
getNano()
Pamiętaj też, że data nie jest tak dokładna jak błyskawiczna.
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Drugie rozwiązanie Eli Courtwright jest złe, powinno być:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
addDays
; jego rozwiązanie jest poprawne. Jeśli chcesz odjąć dni od daty, podaj wartość ujemną dla days
.
java.util.Calendar
teraz, są starsze , wyparte przez klasy java.time . Zobacz samouczek Oracle .