任何人都知道使用Java日历从日期中减去X天的简单方法吗?
我无法找到任何允许我直接从Java日期中减去X天的函数。有人能指出我正确的方向吗?
答案 0 :(得分:285)
根据日历的规则,将指定的时间量添加或减去指定的日历字段。例如,要从日历的当前时间减去5天,您可以通过调用:
来实现Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
答案 1 :(得分:38)
您可以使用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
对象,而不是返回全新的Date
。如果需要,可以很容易地改变其中任何一种功能。
答案 2 :(得分:35)
Anson's answer适用于简单的情况,但如果您要进行更复杂的日期计算,我建议您查看Joda Time。它会让你的生活更轻松。
FYI在Joda时间你可以做到
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
答案 3 :(得分:11)
LocalDate.now().minusDays( 10 )
最好指定时区。
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
与早期版本的Java捆绑在一起的旧日期时间类,例如java.util.Date
/ .Calendar
,已被证明是麻烦,混乱和有缺陷的。避免它们。
Java 8及更高版本使用新的java.time框架取代了那些旧类。见Tutorial。由JSR 310定义,受Joda-Time启发,并由ThreeTen-Extra项目扩展。 ThreeTen-Backport项目将类反向移植到Java 6& 7; Android的ThreeTenABP项目。
该问题含糊不清,不清楚是否要求提供日期或日期时间。
LocalDate
仅限日期,没有时间,请使用LocalDate
课程。请注意,确定日期(例如“今天”)时,时区至关重要。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
ZonedDateTime
如果您指的是日期时间,请使用Instant
课程在UTC的时间轴上获取时间。从那里,调整到时区以获得ZonedDateTime
对象。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 4 :(得分:5)
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)
答案 5 :(得分:5)
我不想按照Eli的建议编写自己的addDays
,而是希望使用 Apache 中的DateUtils
。它非常方便,尤其是当您必须在项目中使用多个位置时。
API说:
addDays(Date date, int amount)
在返回新对象的日期中添加若干天。
请注意,它返回一个新的Date
对象,并且不会对前一个对象进行更改。
答案 6 :(得分:1)
有人推荐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
}
答案 7 :(得分:1)
可以通过以下方式轻松完成
DateAdd()
答案 8 :(得分:1)
我相信可以使用 java.time.Instant 来实现一种简洁而又不错的方法来进行任意时间单位(月,日,小时,分钟,秒等)的减法或加法。 >类。
从当前时间减去5天并将结果作为日期的示例:
new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());
另一个减去1小时加15分钟的示例:
Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));
如果您需要更高的准确性,则Instance的测量时间最高为纳秒。操纵纳秒部分的方法:
minusNano()
plusNano()
getNano()
此外,请记住,日期不如即时准确。
答案 9 :(得分:0)
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());