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

Posted

技术标签:

【中文标题】如何从 Java 中的 Date 对象中减去 X 天?【英文标题】:How to subtract X day from a Date object in Java? 【发布时间】:2012-08-06 15:35:30 【问题描述】:

我想做这样的事情:

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

怎么做?

【问题讨论】:

强制性“使用 Joda Time”备注。 以下链接可能对您有用。[在此处输入链接描述][1] [在此处输入链接描述][2] [1]:***.com/questions/212321/… [2]:***.com/questions/2623610/… 仅供参考,麻烦的旧日期时间类,如 java.util.Date 现在是 legacy,被 java.time 类取代。 【参考方案1】:

Java 8 及更高版本

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

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

同样可以

LocalDate date = someLocalDateInstance.minusDays(300);

java.util.Date java.time.LocalDateTime 之间的转换参考https://***.com/a/23885950/260990

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();

【讨论】:

这是设置您的自定义 dateInstance 以防您不想考虑当前日期时间 Java 的日期处理如此臃肿! 这是 4 岁的答案。对它的最新版本进行了新的 DateTime API 更改。我会编辑答案 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。 @JigarJoshi 如果您使用 Java 8 API 更新您的答案,那就太好了。您的答案是人们首先看到的公认答案。【参考方案2】:

@JigarJoshi 这是一个很好的答案,当然还有@Tim 推荐使用.joda-time。

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

Apache-commons

一种可能性是使用apache-commons-lang。您可以使用DateUtils 执行此操作,如下所示:

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

当然,添加 commons-lang 依赖项来仅做日期减法可能不是一个好的选择,但是如果您已经在使用 commons-lang,这是一个不错的选择。还有addYears,addMonths,addWeeks等方便的方法,看看api here吧。

Java 8

另一种可能性是使用minusDays(long days) 方法从Java 8 中利用新的LocalDate

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

【讨论】:

没有必要使用LocalDateTime,因为该类故意没有时区概念,也没有与UTC的偏移量。仅在区域/偏移量未知或不相关时使用。而是使用LocalDate 并在调用now 方法时传递ZoneId。请参阅 Jacob van Lingen 的 correct Answer。 @BasilBourque 根据您的建议,我检查了 api,您是完全正确的,因此我更新了答案。谢谢。 Brian Montellano 想评论:DateUtils 中不应该有任何s,它只是DateUtil @OleV.V. Brian Montellano 错了,你可以查看DateUtils 文档【参考方案3】:

只需使用它来获取 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

【讨论】:

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。【参考方案4】:

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 可能会有所帮助。此外,通常需要在 Stack Overflow 上进行一些讨论/解释,而不仅仅是代码 sn-p。您绝对应该解释Duration,因为这是您的答案超过the existing one by van Lingen 的附加值。 Java 8 的原因,已修复 如此接近,但应该用于修改任意日期对象,而不是“现在”【参考方案5】:

如您所见HERE,您可以进行很多操作。这是一个展示你可以做什么的例子!

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:我没有看到你的答案...我应该删除我的吗? 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。【参考方案6】:

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

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

可以在here 找到有关新 API 的精彩指南。

【讨论】:

我建议始终将可选时区(或从 UTC 偏移)传递给 now 方法。如果省略,JVM 的当前默认时区将被隐式且静默地应用。该默认值不在您的控制范围内,并且可以随时更改,即使在运行时。示例:LocalDate.now( ZoneId.of( "America/Montreal" ). 根据问题需要在任意日期对象上,而不是“现在”【参考方案7】:

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

dateString 后 7 天:dateCalculate(dateString,"yyyy-MM-dd",7);

要获得 7 天的最新日期字符串: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,现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。 该问题涉及日期时间对象,而不是生成字符串。顺便说一句,LocalDate.parse( "2017-01-23").plusWeeks( 1 ) 比编写自己的方法更简单,而且更能自我记录。【参考方案8】:

在 Java 8 中,您可以这样做:

Instant inst = Instant.parse("2018-12-30T19:34:50.63Z"); 

// subtract 10 Days to Instant 
Instant value = inst.minus(Period.ofDays(10)); 
// print result 
System.out.println("Instant after subtracting Days: " + value); 

【讨论】:

【参考方案9】:

您可以使用 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;

    

【讨论】:

【参考方案10】:

您也可以使用Duration 类。例如

Date currentDate = new Date();
Date oneDayFromCurrentDate = new Date(currentDate.getTime() - Duration.ofDays(1).toMillis());

【讨论】:

【参考方案11】:
c1.set(2017, 12 , 01); //Ex: 1999 jan 20    //System.out.println("Date is : " + sdf.format(c1.getTime()));
  c1.add(Calendar.MONTH, -2); // substract 1 month
  System.out.println
  ("Date minus 1 month : "
      + sdf.format(c1.getTime()));

【讨论】:

欢迎来到 SO。请不要只回答代码。见***.com/help/how-to-answer。请格式化您的代码。

以上是关于如何从 Java 中的 Date 对象中减去 X 天?的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何从Java中存储日期的给定字符串字段中减去X天? [复制]

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

如何从 MySQL 中的日期时间中减去小时数?

如何从 Bigquery 中的某个单元格中减去?

从sql中的表中减去两个日期

如何从 MS SQL 表中具有 MM/DD/YYYY 日期的单个列中减去