当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Java日历从日期中减去X天?》经验,为你挑选了6个好方法。

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

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



1> Anson Smith..:

取自这里的文档:

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

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


在这种情况下,您不会使用`Calendar.DAY_OF_MONTH`,因为它不会像您希望的那样处理月份之间的滚动.请改用"Calendar.DAY_OF_YEAR"
为什么不安全?
这应该是安全的,显然当你添加它时无论是DAY_OF_MONTH还是DAY_OF_YEAR http://stackoverflow.com/q/14065198/32453

2> Eli Courtwri..:

您可以使用该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.如果需要,可以很容易地改变其中任何一种功能.


不要相信.setTime和.add是Calendar的静态方法.您应该使用实例变量c.
小心第一种方式,例如处理成熟的日子时可能会失败:http://stackoverflow.com/a/1006388/32453

3> Mike Deck..:

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

在Joda时间你可以做的

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



4> Basil Bourqu..:
TL;博士
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定义,灵感来自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.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,和更多.



5> matt b..:
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)



6> 小智..:

而不是写我自己addDays的礼的建议,我会更喜欢使用DateUtils来自Apache的.它非常方便,特别是当您必须在项目中使用多个位置时.

API说:

addDays(Date date, int amount)

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

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有