【问题标题】:How do you subtract Dates in Java? [duplicate]你如何在Java中减去日期? [复制]
【发布时间】:2011-04-01 09:18:01
【问题描述】:

为了计算跨度的天数,我不得不深入地减去两个日期,我的心在流血:

    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 中的两行代码,或者您命名的任何现代语言。

这是java的残暴吗?还是有什么我应该知道的隐藏方法?

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

谢谢

【问题讨论】:

  • 你为什么用c3? Afaik,您至少可以省略 c3 的两行;)

标签: java datetime


【解决方案1】:

这确实是标准 Java API 中最大的史诗级失败之一。有一点耐心,然后您将获得由JSR 310 / ThreeTen 指定的新日期和时间 API 风格的解决方案,该 API(很可能)将包含在即将推出的 Java 8 中。

在此之前,您可以使用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();

它的创建者 Stephen Colebourne 是 JSR 310 的幕后推手,所以它看起来非常相似。

【讨论】:

  • 我有一个小项目,只在几个地方需要它。从 .NET 重新开始,我对 java 感到有点愤怒和沮丧。不过,感谢您的确认。
  • 你也可以创建一个实用方法并将它隐藏在你的代码深处,这样你就不会被丑陋的日历 API 直接打扰;)
  • JSR 310 有没有看到这一天?
  • @James:不在 Java 7 中。它可能在 Java 8 中,另请参阅 blog.joda.org/2010/12/what-about-jsr-310_153.html(注意:在此答案后 4 个月发布)。我更新了答案中的链接。
  • 它已在 Java 8 中使用 Period.. leveluplunch.com/java/examples/number-of-days-between-two-dates 实现
【解决方案2】:

如果您处理日期,最好查看 joda 时间库以获得更健全的日期操作模型。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我不认为 GregorianCalendar 是不可变的,所以如果我以后应该再次使用 c2,我有点希望它具有最初定义的值。
    【解决方案4】:

    您可以使用以下方法:

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

    【讨论】:

      【解决方案5】:

      这是基本方法,

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

      有一个简单的方法来实现它。我们可以使用带有循环的 Calendar.add 方法。 beginDate 和 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));**
      

      【讨论】:

      • “减法”这个词的出色运用:)
      猜你喜欢
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多