【问题标题】:How to subtract X day from a Date object in Java?如何从 Java 中的 Date 对象中减去 X 天?
【发布时间】: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"

怎么做?

【问题讨论】:

标签: java date datetime calendar java.util.date


【解决方案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://stackoverflow.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

【讨论】:

【解决方案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
*/

【讨论】:

【解决方案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()));
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 2018-12-19
        相关资源
        最近更新 更多