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

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

  1. java做界面比vb难_请谈谈java的优点和缺点,最好能和vc,delphi,vb作个比较。

    小弟最近想学java,但对java缺乏整体概念,极盼诸位发表高见. 同时对java的开发工具指点一二.谢谢. | 转自unix中文社区 引用>> java!!前途无量啊! 国内的java可 ...

  2. Java自己文章只能自己修改_文章目录Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见。目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽...

    文章目录 Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见. 目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽早的发现BUG. 统一代码风格:统一 ...

  3. java 电池类类代码举例_教案:Java第7章 类的方法

    授课教师:牟勇 课时:100分钟 l 本章技能目标 n 会定义和使用类的方法 n 理解变量作用域 n 会创建包组织Java工程 n 会添加类方法的JavaDoc注释 n 会阅读JavaSE6文档 l ...

  4. java程序的装载与检查_浅谈Java类型装载、连接与初始化

    类型装载.连接与初始化 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.其中装载就是把二进制形式的Java class文件读入Java虚拟机中去;连接 ...

  5. java如何写线程外部类_廖雪峰Java读书笔记(六)--多线程(或称并发)

    1. 多线程基础 首先要明白一些概念: 进程:把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程. 线程:某些进程内部还需要同时执行多个子任务.例 ...

  6. ls mac 显示最近修改日期_如何在Mac上按日期排序文件 | MOS86

    许多Mac用户按名称和类型对文件进行排序,但是按日期排序档案最有用的方法之一就是.Mac Finder可以为文件,文档,应用程序和文件夹提供各种不同的基于日期的排序选项,并且它们通常在Finder列表 ...

  7. Java课程设计和sql数据库_数据库SQLserver+java课程设计

    [实例简介] SQL和java做的课程设计-学生信息管理系统.含源代码,含数据表. [实例截图] [核心代码] 数据库课程设计 └── 数据库课程设计 ├── DSA.class ├── DSA.ja ...

  8. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  9. java实例化类之后如何赋值_深入理解Java对象的创建过程:类的初始化与实例化...

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

最新文章

  1. 分组背包----HDU1712 ACboy needs your help
  2. 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
  3. 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
  4. 32读取ltc的温度值_Arduino基础入门篇29—模拟温度传感器LM35
  5. 爬虫python代码-Python爬虫入门(01) -- 10行代码实现一个爬虫
  6. 九大排序算法-C语言实现及详解
  7. moosefs mysql_moosefs搭建与应用
  8. 小程序、vue 新闻上下轮播
  9. 前端学习(2350):condition启动模式配置
  10. loadrunner学习记录一
  11. 用户登录界面(Bootstrap)入门教程01(适合初学者)
  12. 正则表达式批量替换 单引号
  13. Cassandra安装和初次使用
  14. MIME,拓展名需要相应的软件打开
  15. Java日志框架 -- Logback(Logback入门案例、logback配置(FileAppender、异步日志、拆分Appender、过滤器)、logback-access)
  16. 测试四则运算2:Right-BICEP
  17. 【报告分享】2021国民健康洞察报告-丁香(附下载)
  18. latex 两个表格并排放置
  19. 阅读 | 《娱乐至死》笔记 | Part1
  20. WEP/WPA/WPA2加密标准有什么区别?

热门文章

  1. 怎样分组教学计算机学生才有兴趣,学生计算机论文,关于如何激发职业中专学生学习计算机的兴趣相关参考文献资料-免费论文范文...
  2. php提交飞信,php发送飞信消息
  3. 日周月筛选器_举个栗子!Tableau 技巧(147):使用 动态参数 筛选到最新日期值...
  4. mongoose 验证
  5. 从入门到放弃,.net构建博客系统(二):依赖注入
  6. net.sf.json在处理json对象转换为普通java实体对象时的问题和解决方案
  7. Javascript闭包与作用域
  8. ZOJ 3471 压缩状态DP
  9. 学习官方示例 - SysUtils.EncodeDate、EncodeTime、StrToDate、StrToTime、StrToDateTime
  10. iOS之性能优化·列表异步绘制