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

我还没有找到任何函数可以让我直接从 Java 中的日期减去 X 天。有人能指出我正确的方向吗?

有帮助吗?

解决方案

取自这里的文档

  

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

来实现
Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).

其他提示

您可以使用add方法并将其传递给负数。但是,您也可以编写一个不使用Calendar类的简单方法,如下面的

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对象,而不是返回全新的<=>。如果需要,可以很容易地改变其中任何一种功能。

Anson的答案适用于简单的情况,但如果您要进行更复杂的日期计算,我建议您查看 Joda Time 。它会让你的生活更轻松。

FYI在Joda时间你可以做到

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);

太长了;博士

LocalDate.now().minusDays( 10 )

最好指定时区。

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

细节

旧的日期时间类与早期版本的 Java 捆绑在一起,例如 java.util.Date/.Calendar, ,已被证明是麻烦的、令人困惑的和有缺陷的。避开他们。

java.time

Java 8 及更高版本用新的 java.time 框架取代了这些旧类。看 教程. 。被定义为 JSR 310, ,灵感来自于 乔达时间, ,并扩展为三十额外 项目。ThreeTen-Backport 项目将类向后移植到 Java 6 和 7;将 ThreeTenABP 项目移植到 Android。

该问题含糊不清,不清楚是否要求仅日期或日期时间。

LocalDate

对于仅日期、没有时间的情况,请使用 LocalDate 班级。请注意,时区对于确定“今天”等日期至关重要。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

如果您指的是日期时间,请使用 Instant 上课以了解时间轴 世界标准时间. 。从那里,调整到时区以获得 ZonedDateTime 目的。

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

Table of date-time types in Java, both modern and legacy.


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些课程取代了麻烦的旧课程 遗产 日期时间类,例如 java.util.Date, Calendar, & SimpleDateFormat.

乔达时间 项目,现在在 维护模式, ,建议迁移到 java.time 类。

要了解更多信息,请参阅 甲骨文教程. 。并在 Stack Overflow 上搜索许多示例和解释。规格为 JSR 310.

您可以交换 java.time 对象直接与您的数据库。用一个 JDBC驱动程序 符合 数据库连接4.2 或稍后。不需要字符串,不需要 java.sql.* 类。

从哪里获取 java.time 类?

三十额外 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter, , 和 更多的.

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)

我不想按照Eli的建议编写自己的addDays,而是希望使用 Apache 中的DateUtils。它非常方便,尤其是当您必须在项目中使用多个位置时。

API说:

addDays(Date date, int amount)

在返回新对象的日期中添加若干天。

请注意,它返回一个新的Date对象,并且不会对前一个对象进行更改。

有人推荐了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
}

可以通过以下方式轻松完成

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());
Eli Courtwright第二个解决方案是错误的,应该是:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top