【问题标题】:How to subtract n days from current date in java? [duplicate]如何从java中的当前日期减去n天? [复制]
【发布时间】:2012-05-29 08:57:56
【问题描述】:

我想从 Java 中的当前日期减去 n 天。

我该怎么做?

【问题讨论】:

    标签: java date


    【解决方案1】:

    这将减去当前日期的十天(Java 8 之前):

    int x = -10;
    Calendar cal = GregorianCalendar.getInstance();
    cal.add( Calendar.DAY_OF_YEAR, x);
    Date tenDaysAgo = cal.getTime();
    

    如果您使用的是 Java 8,则可以使用新的日期和时间 API (http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html):

    LocalDate tenDaysAgo = LocalDate.now().minusDays(10);
    

    关于将新类型转换为旧类型,反之亦然,请参阅:Converting between java.time.LocalDateTime and java.util.Date

    【讨论】:

    • Calendar.DAY_OF_YEARCalendar.DATE 有什么区别?两者都给了我结果。
    【解决方案2】:

    您不必使用日历。你可以只玩时间戳:

    Date d = initDate();//intialize your date to any date 
    Date dateBefore = new Date(d.getTime() - n * 24 * 3600 * 1000 l ); //Subtract n days   
    

    更新 不要忘记在 1000 结束前加长“l”。

    请考虑以下警告:

    1000*60*60*24 毫秒添加到 java 日期会偶尔在原始日期添加零天或两天,在闰秒、夏令时等情况下。如果您需要 100% 确定只添加一天,则不适合使用此解决方案。

    【讨论】:

    • 谢谢Houcem Berrayana!!!
    • 如果n 很大(> 24),您需要确保该值被评估为long,因为该值对于int 来说太大了
    • 干净的方式是@Korgen方式,而不是这个
    • 小心,这可能不起作用,例如在处理闰年时:stackoverflow.com/a/1006388/32453
    • 这种方式不处理夏令时。如果您越过时间更改的日期,则时间将相差 +- 1 小时。
    【解决方案3】:

    我找到了这个完美的解决方案,可能有用,你可以直接获取你想要的格式:

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.DATE, -90); // I just want date before 90 days. you can give that you want.
    
    SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); // you can specify your format here...
    Log.d("DATE","Date before 90 Days: " + s.format(new Date(cal.getTimeInMillis())));
    

    谢谢。

    【讨论】:

      【解决方案4】:

      为将来使用查找星期几,扣除日期并显示扣除日期使用日期。

      public static void main(String args[]) throws ParseException {
      
      String[] days = { "Sunday", "Monday", "Tuesday", "Wednesday",
              "Thursday", "Friday", "Saturday" };
      SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy");
      Date dt1 = format1.parse("20/10/2013");
      
      Calendar c = Calendar.getInstance();
      c.setTime(dt1);
      int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
      long diff = Calendar.getInstance().getTime().getTime() ;
      System.out.println(dayOfWeek);
      
      switch (dayOfWeek) {
      
      case 6:
          System.out.println(days[dayOfWeek - 1]);
          break;
      case 5:
      
          System.out.println(days[dayOfWeek - 1]);
          break;      
      case 4:
          System.out.println(days[dayOfWeek - 1]);
          break;
      case 3:
      
          System.out.println(days[dayOfWeek - 1]);
          break;
      case 2:
          System.out.println(days[dayOfWeek - 1]);
          break;
      case 1:
      
          System.out.println(days[dayOfWeek - 1]);
      
           diff = diff -(dt1.getTime()- 3 );
           long valuebefore = dt1.getTime();
           long valueafetr = dt1.getTime()-2;
           System.out.println("DATE IS befor subtraction :"+valuebefore);
           System.out.println("DATE IS after subtraction :"+valueafetr);
      
           long x= dt1.getTime()-(2 * 24 * 3600 * 1000);
           System.out.println("Deducted date to find firday is - 2 days form Sunday :"+new Date((dt1.getTime()-(2*24*3600*1000))));
           System.out.println("DIffrence from now on is :"+diff);
              if(diff > 0) {
      
                  diff = diff / (1000 * 60 * 60 * 24);
                  System.out.println("Diff"+diff);
                  System.out.println("Date is Expired!"+(dt1.getTime() -(long)2));
              }
      
          break;
      }
      }
      

      【讨论】:

        【解决方案5】:

        正如@Houcem Berrayana 所说

        如果你想使用n>24,那么你可以使用如下代码:

        Date dateBefore = new Date((d.getTime() - n * 24 * 3600 * 1000) - n * 24 * 3600 * 1000); 
        

        假设您想查找最近 30 天的日期,那么您将使用:

        Date dateBefore = new Date((d.getTime() - 24 * 24 * 3600 * 1000) - 6 * 24 * 3600 * 1000); 
        

        【讨论】:

        • 我没有看到这个答案增加的价值。 [a] 它重复accepted Answer 中给出的数学运算。 [b] 提供了一个糟糕的解决方案,忽略了时区和夏令时。如果我没有抓住重点,那么也许您应该在答案中添加更多讨论。
        猜你喜欢
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多