有人知道使用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
作为参数传递的对象,而不是返回全新的对象Date
.如果需要,可以很容易地改变其中任何一种功能.
Anson的答案适用于简单的情况,但是如果你要进行更复杂的日期计算,我建议你查看Joda Time.它会让你的生活更轻松.
在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 8及更高版本使用新的java.time框架取代了那些旧类.请参阅教程.由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和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
Java SE 8, Java SE 9, Java SE 10及更高版本
内置.
带有捆绑实现的标准Java API的一部分.
Java 9增加了一些小功能和修复.
Java SE 6和 Java SE 7
许多java.time功能都被反向移植到ThreeTen-Backport中的 Java 6和7 .
Android的
更高版本的Android捆绑java.time类的实现.
对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述).请参阅如何使用ThreeTenABP ....
该ThreeTen-额外项目与其他类扩展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)
而不是写我自己addDays
的礼的建议,我会更喜欢使用DateUtils
来自Apache的.它非常方便,特别是当您必须在项目中使用多个位置时.
API说:
addDays(Date date, int amount)
在返回新对象的日期中添加若干天.
请注意,它返回一个新Date
对象,并且不会对前一个对象进行更改.