java.util.Date - 从日期删除三个月?

问题描述 投票:37回答:10

我有java.util.Date类型的日期

我想减去三个月。

没有在API中找到很多乐趣。

java
10个回答
81
投票

这是普通的JDK版本,它需要Calendar类作为帮助:

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

但你应该认真考虑使用Joda library,因为DateCalendar类的各种缺点。使用Joda,您可以执行以下操作:

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

或者,如果要从给定日期而不是当前日期中减去:

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

Java 8更新:使用Java 8,您还可以使用新的JSR 310 API(受Joda启发):

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

0
投票

使用Java 8你可以这样做,

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

LocalDate类有很多方法可以帮助您轻松计算上述日期,

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

为了计算时间,你可以使用LocalDateTime类,

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

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

使用setTime方法设置日期。


4
投票

我总是推荐Joda这种东西。它具有更好的API,并且不会遇到标准Java日期/时间所具有的线程问题(例如SimpleDateFormat的问题,或者一般的可变性)。

EG

DateTime result = dt.minusMonths(3);

2
投票

Date类本身是不够的(+:你必须在这里使用Calendar类

沿着这些方向的东西

GregorianCalendar lCalendar = new GregorianCalendar();
lCalendar.setTime( aDate );
lCalendar.add(Calendar.MONTH, -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();
}

将返回过去X个月的日期。类似地,这是一个返回过去X天的函数。

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
投票

你想今天 - 3个月格式化为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);

所以这段代码可以完成这项工作;)


1
投票

使用java.sql.Date(java.util.Date的子类)和JDK的8 LocalDate帮助你可以在一行中完成;)

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

0
投票

你可以使用Apache Commons Lang3 DateUtils addMonths函数。

static Date addMonths(Date date, int amount)

在返回新对象的日期添加若干个月。原始日期不变。要添加的金额可能是负数,所以你可以回3个月。


0
投票

您可以使用

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

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.