代码之家  ›  专栏  ›  技术社区  ›  Haoest

在Java中如何减去日期?[副本]

  •  39
  • Haoest  · 技术社区  · 14 年前

    我的心在深深地流着血,要减去两个日期来计算天数:

        GregorianCalendar c1 = new GregorianCalendar();
        GregorianCalendar c2 = new GregorianCalendar();
        c1.set(2000, 1, 1);
        c2.set(2010,1, 1);
        long span = c2.getTimeInMillis() - c1.getTimeInMillis();
        GregorianCalendar c3 = new GregorianCalendar();
        c3.setTimeInMillis(span);
        long numberOfMSInADay = 1000*60*60*24;
        System.out.println(c3.getTimeInMillis() / numberOfMSInADay); //3653
    

    只有两行代码在.NET中,或者任何你命名的现代语言中。

    这是爪哇的暴行吗?或者有什么隐藏的方法我应该知道?

    在util中使用Date类代替GregorianCalendar,可以吗?如果是这样的话,我应该注意像1970年这样的微妙的事情吗?

    5 回复  |  直到 14 年前
        1
  •  49
  •   JodaStephen    11 年前

    这确实是标准javaapi中最大的史诗般的失败之一。有一点耐心,然后您将得到您的解决方案在新的日期和时间API指定的味道 JSR 310 / ThreeTen

    在那之前,你可以逍遥法外 JodaTime

    DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0);
    DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0);
    int days = Days.daysBetween(dt1, dt2).getDays();
    

        2
  •  18
  •   daniel.deng    12 年前

    您可以使用以下方法:

    SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");
    
    long d1=formater.parse("2001-1-1").getTime();
    long d2=formater.parse("2001-1-2").getTime();
    
    System.out.println(Math.abs((d1-d2)/(1000*60*60*24)));
    
        3
  •  3
  •   Peter Tillemans    14 年前

    如果你处理日期,最好看看joda时间库,找到一个更合理的日期操作模型。

    http://joda-time.sourceforge.net/

        4
  •  3
  •   Strom Ali Afshar    14 年前

    您可以删除第三个日历实例。

    GregorianCalendar c1 = new GregorianCalendar();
    GregorianCalendar c2 = new GregorianCalendar();
    c1.set(2000, 1, 1);
    c2.set(2010,1, 1);
    c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis());
    
        5
  •  0
  •   Optimus Prime    10 年前

    这是基本方法,

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    
    Date beginDate = dateFormat.parse("2013-11-29");
    Date endDate = dateFormat.parse("2013-12-4");
    
    Calendar beginCalendar = Calendar.getInstance();
    beginCalendar.setTime(beginDate);
    
    Calendar endCalendar = Calendar.getInstance();
    endCalendar.setTime(endDate);
    

    有一个简单的方法来实现它。我们可以用日历.添加带循环的方法。开始日期和结束日期之间的负天数,以及 实现的代码如下 ,

    int minusDays = 0;
    while (true) {
      minusDays++;
    
      // Day increasing by 1
      beginCalendar.add(Calendar.DAY_OF_MONTH, 1);
    
      if (dateFormat.format(beginCalendar.getTime()).
                equals(dateFormat.format(endCalendar).getTime())) {
        break;
      }
    }
    System.out.println("The subtraction between two days is " + (minusDays + 1));**