2009-08-21 4 views
26

J'ai une date de type java.util.Datejava.util.Date - Suppression de trois mois d'une date?

Je veux soustraire trois mois de celui-ci.

Ne pas trouver beaucoup de joie dans l'API.

+7

Vous ne trouverez pas beaucoup de joie avec l'API de date/heure de Java car c'est l'une des pires du JDK (performance, threading, illogique, ...). Je recommande Joda Time en remplacement. Cette bibliothèque influence fortement la nouvelle date/heure JSR-310 qui sera ajoutée à Java soit en Java 7 ou plus tard. – SteveD

Répondre

55

est ici la plaine JDK version, il a besoin de la classe Calendar comme aide:

Date referenceDate = new Date(); 
Calendar c = Calendar.getInstance(); 
c.setTime(referenceDate); 
c.add(Calendar.MONTH, -3); 
return c.getTime(); 

Mais vous devriez sérieusement envisager d'utiliser le Joda library, en raison de diverses lacunes des classes Date et Calendar. Avec Joda, vous pouvez effectuer les opérations suivantes:

new DateTime().minusMonths(3).toDate(); 

Ou si vous voulez soustraire à une place date donnée du courant:

new DateTime(referenceDate).minusMonths(3).toDate(); 

Mise à jour pour Java 8: Avec Java 8, vous pouvez également utiliser la nouvelle API JSR 310 (qui est inspiré par Joda):

LocalDateTime.from(referenceDate.toInstant()).minusMonths(3); 
+0

+1 pour Joda. Il est très facile de faire une comparaison même avec java.util.Date. –

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

Définissez votre date à l'aide de la méthode setTime.

+2

"définir votre date en utilisant la méthode setTime" - et dans cette phrase simple est la somme de tout ce qui ne va pas avec java.util.Date :-) –

+0

Quel est le problème avec java.util.Date – firstthumb

+0

@Firstthumb: Les problèmes les plus importants est que Date n'est pas immuable. Le setter montre ce problème. Mais contrairement au commentaire de Brian, il y a d'autres problèmes. Voir le site Joda pour quelques explications sur la raison pour laquelle ils ont créé la bibliothèque Joda. –

2

La classe date elle-même ne suffit pas (+: Vous devez utiliser la classe Calendrier ici

Quelque chose le long de ces lignes

GregorianCalendar lCalendar = new GregorianCalendar(); 
lCalendar.setTime(aDate); 
lCalendar.add(Calendar.MONTH, -3); 

ps l'extrait ci-dessus ne sont pas VERIFIE . compilable

+3

Y at-il une raison pour laquelle vous faites GregorianCalendar lCalendar = new GregorianCalendar(); au lieu de Calendrier lCalendar = Calendar.getInstance()? – Jesper

+0

L'instanciation de GregorianCalendar montre directement certaines connaissances du fonctionnement interne de java.util.Calendar. Toutefois, pour obtenir votre calendrier via la fabrique Calendar.getInstance() fournit automatiquement le calendrier le mieux adapté en fonction des informations importantes concernant votre emplacement. Si cela est un calendrier grégorien, alors vous aurez un calendrier grégorien. L'usine est donc l'approche la plus polyvalente. – 000

4

Je toujours recommande Joda pour ce genre de choses. Il a une API beaucoup plus agréable, et ne souffre pas de problèmes de threading que la date/heure Java standard a (par exemple, des problèmes avec SimpleDateFormat, ou une mutabilité générale).

par exemple.

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

retournera les mois la date de X dans le passé. De même, voici une fonction qui renvoie la date X jours dans le passé.

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

Vous voulez aujourd'hui - 3 mois formaté comme 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); 

Donc, ce code peut faire le travail;)

0

Ok avec java.sql.Date (sous-classe de java. 8 LocalDate de util.Date) et JDK l'aide que vous pouvez le faire en une seule ligne;)

Date date = java.sql.Date.valueOf(LocalDate.now().minus(3, ChronoUnit.MONTHS)); 
0

vous pouvez utiliser Apache Commons Lang3DateUtilsaddMonths fonction.Ajoute un nombre de mois à une date renvoyant un nouvel objet.

static Date addMonths(Date date, int amount) 

Ajoute un nombre de mois à une date renvoyant un nouvel objet. La date d'origine est inchangée. Le montant à ajouter, peut être négatif, de sorte que vous pouvez aller 3 mois en arrière.

Questions connexes