Mam datę typu java.util.Date
java.util.Date - Usuwanie trzech miesięcy z daty?
Chcę odjąć trzy miesiące od tego.
Nie znajduje się wiele radości w API.
Mam datę typu java.util.Date
java.util.Date - Usuwanie trzech miesięcy z daty?
Chcę odjąć trzy miesiące od tego.
Nie znajduje się wiele radości w API.
Oto zwykły JDK wersja, musi klasę Calendar
jako pomocnik:
Date referenceDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(referenceDate);
c.add(Calendar.MONTH, -3);
return c.getTime();
Ale powinieneś poważnie rozważyć użycie Joda library, z powodu różnych niedociągnięć klas Date
i Calendar
. Z Joda można wykonać następujące czynności:
new DateTime().minusMonths(3).toDate();
Albo jeśli chcesz odjąć od danej daty zamiast prądu:
new DateTime(referenceDate).minusMonths(3).toDate();
aktualizacji dla Java 8: z Java 8 można również korzystać z nowego API JSR 310 (który jest inspirowany przez Joda):
LocalDateTime.from(referenceDate.toInstant()).minusMonths(3);
+1 dla Joda. Bardzo łatwo zrobić porównanie nawet z java.util.Date. –
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.MONTH, -3);
Ustaw datę przy użyciu metody setTime
.
"Ustaw datę przy użyciu metody setTime" - iw tym prostym zdaniu jest podsumowaniem wszystkiego, co jest nie tak z java.util.Date :-) –
Co jest nie tak z java.util.Date – firstthumb
@Firstthumb: Najważniejsze problemy czy ta data nie jest niezmienna. Seter pokazuje ten problem. Ale w przeciwieństwie do komentarza Briana są inne problemy. Sprawdź na stronie Jody wyjaśnienia, dlaczego stworzyli bibliotekę Joda. –
Klasa Data sama nie wystarcza (+: Musisz użyć klasy tutaj Kalendarz
coś wzdłuż tych linii
GregorianCalendar lCalendar = new GregorianCalendar();
lCalendar.setTime(aDate);
lCalendar.add(Calendar.MONTH, -3);
ps urywek powyżej nie jest testowany być . compilable
Czy istnieje powód, dla którego robisz GregorianCalendar lCalendar = new GregorianCalendar(); zamiast kalendarza lCalendar = Calendar.getInstance()? – Jesper
Tworzenie kalendarza gregoriańskiego bezpośrednio pokazuje pewną znajomość wewnętrznego działania java.util.Calendar. Aby jednak uzyskać kalendarz za pośrednictwem fabryki, Calendar.getInstance() automatycznie udostępnia najlepiej dopasowany kalendarz na podstawie ważnych informacji o Twojej lokalizacji. Jeśli to będzie Kalendarium Gregoriańskie, to dostaniesz Kalendarium Gregoriańskie. Fabryka jest zatem bardziej wszechstronnym podejściem. – 000
I zawsze polecić Joda dla tego rodzaju rzeczy. Ma znacznie ładniejszy interfejs API i nie ma problemów z wątkami, które ma standardowa data/godzina Java (np. Problemy z SimpleDateFormat
lub ogólną zmiennością).
np.
DateTime result = dt.minusMonths(3);
public static Date getDateMonthsAgo(int numOfMonthsAgo)
{
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MONTH, -1 * numOfMonthsAgo);
return c.getTime();
}
powróci datą X miesięcy w przeszłości. Podobnie, oto funkcja, która zwraca datę X dni w przeszłości.
public static Date getDateDaysAgo(int numOfDaysAgo)
{
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DAY_OF_YEAR, -1 * numOfDaysAgo);
return c.getTime();
}
Chcesz dziś - 3 Miesiąc sformatowane jako dd MMMM yyyy
SimpleDateFormat format = new SimpleDateFormat("dd MMMM yyyy");
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MONTH, -3);
Date d = c.getTime();
String res = format.format(d);
System.out.println(res);
Więc ten kod może wykonać zadanie;)
OK z java.sql.Date (podklasa Java. util.Date) oraz JDK za 8 LOCALDATE pomocą można zrobić w jednej linii;)
Date date = java.sql.Date.valueOf(LocalDate.now().minus(3, ChronoUnit.MONTHS));
można użyć Apache Commons Lang3DateUtilsaddMonths funkcja.
static Date addMonths(Date date, int amount)
Dodaje liczbę miesięcy do daty zwracania nowego obiektu. Oryginalna data pozostaje niezmieniona. Ilość do dodania może być ujemna, więc możesz przejść 3 miesiące wstecz.
Nie znajdziesz wiele radości z API daty/czasu Java, ponieważ jest to jeden z najgorszych w JDK (wydajność, wątki, nielogiczne, ...). Polecam Joda Time jako zamiennik. Ta biblioteka ma duży wpływ na nową datę/godzinę JSR-310, która zostanie dodana do środowiska Java w wersji 7 lub nowszej. – SteveD