2009-08-21 17 views
26

Mam datę typu java.util.Datejava.util.Date - Usuwanie trzech miesięcy z daty?

Chcę odjąć trzy miesiące od tego.

Nie znajduje się wiele radości w API.

+7

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

Odpowiedz

55

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); 
+0

+1 dla Joda. Bardzo łatwo zrobić porównanie nawet z java.util.Date. –

13
Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date()); 
cal.add(Calendar.MONTH, -3); 

Ustaw datę przy użyciu metody setTime.

+2

"Ustaw datę przy użyciu metody setTime" - iw tym prostym zdaniu jest podsumowaniem wszystkiego, co jest nie tak z java.util.Date :-) –

+0

Co jest nie tak z java.util.Date – firstthumb

+0

@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. –

2

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

+3

Czy istnieje powód, dla którego robisz GregorianCalendar lCalendar = new GregorianCalendar(); zamiast kalendarza lCalendar = Calendar.getInstance()? – Jesper

+0

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

4

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); 
1
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(); 
} 
1

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;)

0

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)); 
0

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.

Powiązane problemy