java做日历怎么对齐日期_如何使用Java日历从日期中减去X天?

如何使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值