如何从Java中的Date对象中减去X天?


146

我想做类似的事情:

Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"

怎么做?


4
强制性的“使用Joda时间”备注。
史蒂夫·麦克劳德

1
以下链接可能对您有用。[在此处输入链接描述] [1] [在此处输入链接描述] [2] [1]:stackoverflow.com/questions/212321/… [2]:stackoverflow.com/questions/ 2623610 /…
阿美(Ami)

仅供参考,麻烦的旧日期时间类(例如java.util.Date现在已被遗留的类)已由java.time类取代。
罗勒·布尔克

Answers:


279

Java 8及更高版本

随着Java 8的日期时间API的更改,使用 LocalDate

LocalDate date = LocalDate.now().minusDays(300);

同样,您可以拥有

LocalDate date = someLocalDateInstance.minusDays(300);

请参阅https://stackoverflow.com/a/23885950/260990,以获取java.util.Date <-> java.time.LocalDateTime之间的转换

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

Java 7及更早版本

使用Calendaradd()方法

Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();

22
如果您不想考虑当前日期时间,它会设置您的自定义dateInstance
Jigar Joshi

11
Java的日期处理是如此肿!
digory doo

1
这是4岁的答案。DateTime API对其最新版本进行了新的更改。我将编辑答案
Jigar Joshi

仅供参考,麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat现在的遗产,由取代java.time类。请参见Oracle教程
罗勒·布尔克

@JigarJoshi,如果您使用Java 8 API更新了答案,那就太好了。您的答案是人们首先看到的公认的答案。
jotaen

47

@JigarJoshi是个好答案,当然也推荐使用@Tim。乔达时间

我只想增加更多的可能性以从中减去天数java.util.Date

阿帕奇

一种可能性是使用apache-commons-lang。您可以使用DateUtils以下方法进行操作:

Date dateBefore30Days = DateUtils.addDays(new Date(),-30);

当然,将commons-lang依赖项添加为仅做日期减法可能不是一个好选择,但是,如果您已经在使用commons-lang它,则是一个不错的选择。还有一个简便的方法addYearsaddMonthsaddWeeks等等,看看在这里的API

Java 8

另一种可能是利用新LocalDateJava的8使用minusDays(long days)方法:

LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);

LocalDateTime故意使用该类没有意义,没有时区的概念,也没有UTC的偏移量。仅当区域/偏移量未知或不相关时才使用该选项。而是在调用其方法时使用LocalDate并传递a 。请参阅雅各布·范·林根的正确答案ZoneIdnow
罗勒·布尔克

1
@BasilBourque在您提出建议后,我检查了api,您说的对,所以我更新了答案。谢谢。
albciff

布赖恩蒙特拉诺想评论:不应该有任何sDateUtils,它只是DateUtil
Ole VV

@ OleV.V。布莱恩· DateUtils
蒙泰拉诺(

33

只需使用此方法即可获取300天之前的日期,请用您的天数替换300:

Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();

这里,

DateTimeorg.joda.time.DateTime;

Datejava.util.Date


7
乔达时间的项目现在处于维护模式,并建议迁移到java.time类。
罗勒·布尔克

13

Java 8时间API:

Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);

我必须指的是Java 8 API,而不是7。提及该软件包java.time可能会有所帮助。另外,通常期望在堆栈溢出上进行一些讨论/解释,而不仅仅是代码片段。您绝对应该解释一下,Duration因为那是van Lingen在现有答案上附加值。
罗勒·布尔克

原因已修复的Java 8
Grigory Kislin,2016年

如此接近,但应该用于修改任意日期对象,而不是“现在”
bharal

9

正如你可以看到这里有很多的操作,你可以做的。这是一个示例,显示您可以做什么!

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();

//Add one day to current date.
cal.add(Calendar.DATE, 1);
System.out.println(dateFormat.format(cal.getTime()));

//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));

/* Can be Calendar.DATE or
*  Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/

@Jigar Joshi:我没看到您的答案...我应该删除我的吗?
waldyr.ar 2012年

仅供参考,非常麻烦旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle 教程
罗勒·布尔克

9

使用Java 8,现在真的很简单:

 LocalDate date = LocalDate.now().minusDays(300);

可以在这里找到有关新api的出色指南。


4
我建议始终将可选时区(或UTC偏移量)传递给该now方法。如果省略,则隐式和静默应用JVM的当前默认时区。该默认值在您的控制范围之外,并且可以随时更改,即使运行时也可以更改。范例:LocalDate.now( ZoneId.of( "America/Montreal" )
罗勒·布尔克

需要根据问题在任意日期对象上,而不是“现在”
bharal

1

我创建了一个函数来简化任务。

  • 在dateString之后的7天内: dateCalculate(dateString,"yyyy-MM-dd",7);

  • 要获得长达7天的dateString: dateCalculate(dateString,"yyyy-MM-dd",-7);


public static String dateCalculate(String dateString, String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    try {
        cal.setTime(s.parse(dateString));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    cal.add(Calendar.DATE, days);
    return s.format(cal.getTime());
}

这个答案使用麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat是现在的传统,由取代java.time类。请参见Oracle教程
罗勒·布尔克

问题涉及日期时间对象,而不生成字符串。顺便说一句,LocalDate.parse( "2017-01-23").plusWeeks( 1 )它比编写自己的方法更简单,并且具有更多的自说明性。
罗勒·布尔克

0

您可以使用SimpleDateFormat用日历轻松减去

 public static String subtractDate(String time,int subtractDay) throws ParseException {


        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
        cal.setTime(sdf.parse(time));
        cal.add(Calendar.DATE,-subtractDay);
        String wantedDate = sdf.format(cal.getTime());

        Log.d("tag",wantedDate);
        return wantedDate;

    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.