java.util.Date - Deleting three months from a date?

Java

Java Problem Overview


I have a date of type java.util.Date

I want to subtract three months from it.

Not finding a lot of joy in the API.

Java Solutions


Solution 1 - Java

Here's the plain JDK version, it needs the Calendar class as a helper:

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

But you should seriously consider using the Joda library, because of various shortcomings of the Date and Calendar classes. With Joda you can do the following:

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

Or if you want to subtract from a given date instead of the current:

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

Update for Java 8: With Java 8 you can also use the new JSR 310 API (which is inspired by Joda):

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

Solution 2 - Java

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

Set your date using setTime method.

Solution 3 - Java

Using Java 8 you can do it like this,

Date d = Date.from(LocalDate.now().minusMonths(3).atStartOfDay(ZoneId.systemDefault()).toInstant());

The LocalDate class has a lot of methods to help you make easy computations about dates like the above,

// Add 2 months
Date d = Date.from(LocalDate.now().plusMonths(2).atStartOfDay(ZoneId.systemDefault()).toInstant());
// Add 5 days
Date d = Date.from(LocalDate.now().plusDays(5).atStartOfDay(ZoneId.systemDefault()).toInstant());
// Minus 1 day and 1 year
Date d = Date.from(LocalDate.now().minusYears(1).minusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());

In order to compute time you can use the LocalDateTime class,

// Minus 1 year, minus 1 days, plus 1 hour
Date d = Date.from(LocalDateTime.now().minusYears(1).minusDays(1).plusHours(1).toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant());

Solution 4 - Java

I always recommend Joda for this sort of stuff. It has a much nicer API, and doesn't suffer from threading issues that the standard Java date/time has (e.g. issues with SimpleDateFormat, or general mutability).

e.g.

DateTime result = dt.minusMonths(3);

Solution 5 - Java

Ok with java.sql.Date (subclass of java.util.Date) and JDK's 8 LocalDate help you can do it in one line ;)

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

Solution 6 - Java

The Date class itself isn't enough (+: You've got to use the Calendar class here

Something along these lines

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

p.s. the snippet above is not tested to be compilable.

Solution 7 - Java

You want today - 3 Month formatted as 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);

So this code can do the job ;)

Solution 8 - Java

public static Date getDateMonthsAgo(int numOfMonthsAgo)
{
	Calendar c = Calendar.getInstance(); 
	c.setTime(new Date()); 
	c.add(Calendar.MONTH, -1 * numOfMonthsAgo);
	return c.getTime();
}

will return the date X months in the past. Similarily, here's a function that returns the date X days in the past.

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

Solution 9 - Java

You can use Apache Commons Lang3 DateUtils addMonths function.

static Date addMonths(Date date, int amount)

Adds a number of months to a date returning a new object. The original Date is unchanged. The amount to add, may be negative, so you can go 3 months back.

Solution 10 - Java

You can use

Date d1 = new Date()
d1.setMonth(d1.month-3)

Hope this helps

Solution 11 - Java

String startDate="15/10/1987";

	Date date = new SimpleDateFormat("dd/MM/yyyy").parse(startDate);
    String formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(date);
    LocalDate today = LocalDate.parse(formattedDate);
    String endDate=today.minusMonths(3).toString();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAJMView Question on Stackoverflow
Solution 1 - JavaDaniel RikowskiView Answer on Stackoverflow
Solution 2 - JavafirstthumbView Answer on Stackoverflow
Solution 3 - JavaGeorgios SyngouroglouView Answer on Stackoverflow
Solution 4 - JavaBrian AgnewView Answer on Stackoverflow
Solution 5 - JavaPatrik BegoView Answer on Stackoverflow
Solution 6 - JavaEveryoneView Answer on Stackoverflow
Solution 7 - JavaValentin MontmirailView Answer on Stackoverflow
Solution 8 - JavaTheWestIsThe...View Answer on Stackoverflow
Solution 9 - JavaRobert NiestrojView Answer on Stackoverflow
Solution 10 - JavaGelberth Amarillo RojasView Answer on Stackoverflow
Solution 11 - JavaprasadView Answer on Stackoverflow