【问题标题】:Given several pairs of dates, how to count number of days in between but don't count overlapping days?给定几对日期,如何计算两者之间的天数但不计算重叠天数?
【发布时间】:2014-07-25 22:41:23
【问题描述】:

这个问题在我的采访中被问到。

String d1="7 dec 2012";
String d2="15 dec 2012";

String d3="12 dec 2012";
String d4="16 dec 2012";

String d5="16 dec 2012";
String d6="24 dec 2012";

Number of days between d1 and d2 is: 9  
Number of days between d3 and d4 is: 1 (12 Dec to 15 Dec counted in d1 and d2,
                                        don't count overlapping days)  
Number of days between d3 and d4 is: 8 (16 Dec counted in d3 and d4, 
                                        don't count overlapping days)

Now final output should be: 9 + 1 + 8

我应该使用什么算法?

【问题讨论】:

  • 看来你知道该怎么做了……
  • 您可以在循环中使用日历或 JodaTime。既然你已经陈述了问题,你可能想问一个实际的问题

标签: java string date


【解决方案1】:

下面的代码是基本编码(非常简单的基本方法),用于计算 2 天之间的日期差。它没有考虑夏令时和任何重叠的日期。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TestJava {
 public static int daysBetween(Date d1, Date d2)
 {
     /*This function returns the difference in days given 2 dates as input*/
         return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
 }

 public static void main(String args[]) throws ParseException
 {
     Calendar cal1 = new GregorianCalendar();
     Calendar cal2 = new GregorianCalendar();

     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
     Date date = sdf.parse("07122012");  // Date1
     cal1.setTime(date);
     date = sdf.parse("15122012"); // Date2
     cal2.setTime(date);
     int daysBetween = daysBetween(cal1.getTime(),cal2.getTime());  // Days between Date1 and Date2
     int interval = daysBetween(cal1.getTime(),cal2.getTime());
     System.out.println("Interval1 == "+ interval);

     date = sdf.parse("12122012"); // Date3
     cal1.setTime(date);
     date = sdf.parse("16122012"); // Date4
     cal2.setTime(date);
     daysBetween += daysBetween(cal1.getTime(),cal2.getTime()); // Days between Date3 and Date4 is added to the previously available value of days between Date1 and Date2
     interval = daysBetween(cal1.getTime(),cal2.getTime());
     System.out.println("Interval2 == "+ interval);

     date = sdf.parse("16122012");
     cal1.setTime(date);
     date = sdf.parse("24122012");
     cal2.setTime(date);
     daysBetween += daysBetween(cal1.getTime(),cal2.getTime()); // Total required difference as per the question
     interval = daysBetween(cal1.getTime(),cal2.getTime());
     System.out.println("Interval3 == "+ interval);

     System.out.println("Total Interval == "+ daysBetween);
 }
}

【讨论】:

  • 如果您d2 发生在夏令时,而d1 没有发生,则此代码会出现“out by one”错误。通过除以(24 * 60 * 60 * 1000) 将毫秒转换为天通常是错误的,因为有 23 小时天和 25 小时天。
  • @DavidWallace:我只是提供了一个简单的方法作为答案,可以在面试中接受。当然,为了得到完美的答案,我们还需要考虑夏令时和时区/语言环境。
  • 您不需要考虑时区和语言环境。您只需要担心d2 有夏令时而d1 没有的情况。采访者可能想知道被采访者是否会知道这一点。对此类问题给出错误答案并不是获得工作的最佳方式。
  • 我忘记了分号。立即检查。
  • 另外,既然您只使用Date 进行算术运算,您为什么还要为Calendar 课程烦恼?这比它应该的要复杂得多。
【解决方案2】:

问题应该分三步解决:

第 1 步:找出重叠天数。

第 2 步:找出给定日期之间的差异。

步骤 3:将步骤 2 中获得的差异减去步骤 1 中获得的重叠天数,这将为您提供不计算重叠日期的日期之间的确切差异......!

下面的代码将为您服务:

package mypack;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DatesNoOverlap 
{
public static void main(String args[])
{
    String d[]=new String[6];
    d[0]="7/12/2012";
    d[1]="15/12/2012";

    d[2]="12/12/2012";
    d[3]="16/12/2012";

    d[4]="16/12/2012";
    d[5]="24/12/2012";

    int num[]=new int[6];
    int counter=0;
    for(int i=0;i<d.length;i++)
    {
        for(int j=0;j<d[i].length();j++)
        {
            if(d[i].charAt(j)=='/')
            {
                num[counter]=Integer.parseInt(d[i].substring(0,j));
                counter++;
                break;
            }
        }
    }
    int sum1=0;
    for(int m=0;m<counter-1;m++)
    {
        if(m>0&&m%2!=0)
        {
            if(num[m+1]<=num[m])
            {
                sum1=sum1+(num[m]-num[m+1]+1);
            }
        }

    }
    System.out.println("Number of overlapping days........="+sum1);
    long sum2=0;
    for(int n=0;n<counter-1;n=n+2)
    {       
    SimpleDateFormat format = new SimpleDateFormat("dd/mm/yyyy");

    Date d1 = null;
    Date d2 = null;

    try {
        d1 = format.parse(d[n]);
        d2 = format.parse(d[n+1]);
        //in milliseconds
        long diff = d2.getTime() - d1.getTime();
        long diffDays = diff / (24 * 60 * 60 * 1000);
                    sum2=sum2+diffDays+1;
    }
            catch (Exception e) {
        e.printStackTrace();
    }
    }
    System.out.println("Complete Difference = "+sum2);
    System.out.println("Exact Difference = "+(sum2-sum1));
}

}

【讨论】:

  • 就像目前在这里的另一个答案一样,出于同样的原因,这在 25% 的情况下都会出错。不要以为你可以通过除以24 * 60 * 60 * 1000 将毫秒转换为天。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2019-09-27
相关资源
最近更新 更多