如何使用Java日历从日期中减去X天?

有人知道使用Java日历从日期中减去X天的简单方法吗?

我无法找到任何允许我直接从Java中的日期减去X天的函数。 有人能指出我正确的方向吗?

9个解决方案

273 votes

取自这里的文档:

根据日历的规则,将指定的时间量添加或减去给定的日历字段。 例如,要从日历的当前时间减去5天,您可以通过调用以下内容来实现:

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).
Anson Smith answered 2019-04-16T21:34:21Z
38 votes
您可以使用Date方法并将其传递给负数。 但是,您还可以编写一个更简单的方法,不使用Date类,如下所示
public static void addDays(Date d, int days)
{
d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}
这将获取日期的时间戳值(自纪元以来的毫秒数)并添加适当的毫秒数。 您可以为days参数传递负整数以进行减法。 这比“适当的”日历解决方案简单:
public static void addDays(Date d, int days)
{
Calendar c = Calendar.getInstance();
c.setTime(d);
c.add(Calendar.DATE, days);
d.setTime( c.getTime().getTime() );
}
请注意,这两个解决方案都会更改作为参数传递的Date对象,而不是返回一个全新的Date。如果需要,可以轻松更改其中任何一个函数。
Eli Courtwright answered 2019-04-16T21:34:59Z
35 votes
Anson的答案适用于简单的情况,但是如果你要进行更复杂的日期计算,我建议你查看Joda Time。 它会让你的生活更轻松。
在Joda时间你可以做的
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
Mike Deck answered 2019-04-16T21:35:29Z
10 votes
TL;博士
LocalDate.now().minusDays( 10 )
最好指定时区。
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
细节
与早期版本的Java捆绑在一起的旧日期时间类,例如YearQuarter/.Calendar,已被证明是麻烦,令人困惑和有缺陷的。 避免他们。
java.time
Java 8及更高版本使用新的java.time框架取代了那些旧类。 请参阅教程。 由JSR 310定义,灵感来自Joda-Time,并由ThreeTen-Extra项目扩展。 ThreeTen-Backport项目将类反向移植到Java 6&7; Android的ThreeTenABP项目。
该问题含糊不清,如果要求仅提供日期或日期时间,则不清楚。
YearQuarter
对于仅限日期,没有时间,请使用YearQuarter类。 请注意,在确定日期(例如“今天”)时,时区至关重要。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
YearQuarter
如果您的意思是日期时间,那么请使用YearQuarter类来获取UTC时间轴上的时刻。 从那里,调整到时区以获得YearQuarter对象。
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如YearQuarter,YearQuarter,&YearQuarter。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310。
您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序。 不需要字符串,不需要YearQuarter类。
从哪里获取java.time类?
Java SE 8,Java SE 9,Java SE 10及更高版本内置。
带有捆绑实现的标准Java API的一部分。
Java 9增加了一些小功能和修复。
Java SE 6和Java SE 7许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
Android的更高版本的Android捆绑java.time类的实现。
对于早期的Android(< 26),ThreeTenABP项目采用ThreeTen-Backport(如上所述)。 请参见如何使用ThreeTenABP ....
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如YearQuarter,YearQuarter,YearQuarter等。
Basil Bourque answered 2019-04-16T21:37:22Z
5 votes
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);
编辑:解析器似乎不喜欢Javadoc的链接,所以这里是纯文本:
[http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int,)int)
matt b answered 2019-04-16T21:37:53Z
5 votes
而不是按照Eli的建议编写我自己的Date,我更愿意使用Apache的DateUtils。 它非常方便,特别是当您必须在项目中使用多个位置时。
API说:
Date
在返回新对象的日期中添加若干天。
请注意,它返回一个新的Date对象,并且不会对前一个对象进行更改。
Risav Karna answered 2019-04-16T21:38:40Z
1 votes
有人推荐Joda Time所以 - 我一直在使用这个CalendarDate类[http://calendardate.sourceforge.net]
这是一个与Joda Time有点竞争的项目,但只有2个班级更基本。 它非常方便,并且非常适合我需要的东西,因为我不想使用比我的项目更大的包。 与Java对应物不同,它的最小单位是当天,所以它实际上是一个日期(没有它到毫秒或其他东西)。 一旦你创建了日期,你所做的所有减法就像myDay.addDays(-5)那样可以追溯到5天。 您可以使用它来查找星期几和类似的事情。另一个例子:
CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);
和:
//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
dayLabel = cdf.format(currDay);
if (currDay.equals(today))
dayLabel = "Today";//print "Today" instead of the weekday name
System.out.println(dayLabel);
currDay = currDay.addDays(1);//go to next day
}
mikato answered 2019-04-16T21:39:13Z
1 votes
它可以通过以下方式轻松完成
Calendar calendar = Calendar.getInstance();
// from current time
long curTimeInMills = new Date().getTime();
long timeInMills = curTimeInMills - 5 * (24*60*60*1000); // `enter code here`subtract like 5 days
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
// from specific time like (08 05 2015)
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.MONTH, (5-1));
calendar.set(Calendar.YEAR, 2015);
timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
rab answered 2019-04-16T21:39:38Z
0 votes
Eli Courtwright的第二个解决方案是错误的,它应该是:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
user178973 answered 2019-04-16T21:40:03Z