【问题标题】:Java program to get the difference between two datesJava程序来获取两个日期之间的差异
【发布时间】:2015-02-14 11:21:23
【问题描述】:

这是程序:

class DateDiff {
int month[];//stores the number of days in all the months
int d,y,m,n;
DateDiff(int d,int m,int y)    {
    month=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
    this.d=d;
    this.m=m;
    this.y=y;
    if(isLeap(y))
        month[1]=29;//if year is leap, February has 29 days
    else
        month[1]=28;
    n=0;
}
//function for checking for Leap Year
boolean isLeap(int y3)    {
    if((y3%400==0) || ((y3%100!=0)&&(y3%4==0)))
        return true;
    else
        return false;
}
//function for finding the number of days that have passed from start of the year 
int getDayNum(int d1,int m1,int y1)    {
    int i=0;
    if(isLeap(y1))//February leap year correction
        month[1]=29;
    else
        month[1]=28;
    for(;i<m1;i++)
        if(d<=month[i]&&i==m1-1)            {
            n+=d1;//add days when month hasn't completed
            break;
        }
        else 
            n+=month[i];  //add the normal number of days in the month
    return n;
}
//finding difference between the dates
int diff(int d2,int m2,int y2)    {
    int daysLeft=getDayNum(d,m,y);//store the number of days passed since start of the year y
    if(isLeap(y))
        daysLeft=366-daysLeft;//subtracting gives the number of days left in year y
    else
        daysLeft=365-daysLeft;
    for(int x=y+1;x<y2;x++)//for subsequent years add 366 or 365 days as required
        if(isLeap(x))
            daysLeft+=366;
        else
            daysLeft+=365;
    daysLeft+=getDayNum(d2,m2,y2);//add the number of days that have passed since start of year y2
    return daysLeft;}}
public class DateDifference{   
 public static int main(int d1,int m1,int y1,int d2,int m2,int y2)    {
        DateDiff obj=new DateDiff(d1,m1,y1);
        return obj.diff(d2,m2,y2);
    }
}

我没有通过这个程序得到正确的输出。通过d1=20,m2=3,y1=1997d2=14,m2=2,y2=2015(日期分别为 1997 年 3 月 20 日和 2015 年 2 月 14 日)。

正确的差异是 6540 天。我的程序给了 6619 天。有人可以指出错误吗?

【问题讨论】:

  • 看起来您是在做某种学习练习,但以防万一您不知道,Java 拥有自己的 Date API,可以开箱即用地执行此操作。最好使用语言提供的工具。 docs.oracle.com/javase/7/docs/api/java/util/Date.html
  • OP 也可能对使用 joda-time 库或 Java 8 提供的更新的 java.time API 感兴趣:stackoverflow.com/questions/12032051/…
  • @Alex T. 是的,这是一个学习练习。我确实知道 Java 有内部 API 可以为我做到这一点,但我不会按照老师的指示使用它。我必须从基础开始。
  • 使用 java 8 中的 LocalDate 和 Period 类。在下面查看我的答案

标签: java arrays


【解决方案1】:
public DateDiff(int d,int m,int y){
    m--;

public int diff(int d2,int m2,int y2)    {
    m2--;

在某些地方,您必须将月份数字 1-12 的“人类”形式调整为您选择的内部形式 0-11。

根据您是否调整月份,为所有通话添加公开和私密。

稍后更多修复

删除这些行。他们在一个无用的地方。

if(isLeap(y))
    month[1]=29;//if year is leap, February has 29 days
else
    month[1]=28;
n=0;

不要将字段用于本地总和。 (int n)。

int getDayNum(int d1,int m1,int y1)    {
  if(isLeap(y1))//February leap year correction
    month[1]=29;
  else
    month[1]=28;
  int n = 0;
  for(int i = 0; i<m1; i++){
    n += month[i];
  }
  n += d1;//add days when month hasn't completed
  return n;
}

循环构造是不明智的。没有如果!

编码风格的一些改进:

class DateDiff
  int month[] = new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
  int d,y,m;
  DateDiff(int d,int m,int y)    {
    this.d=d;
    this.m=m-1;
    this.y=y;
  }
  boolean isLeap(int y3)    {
    return (y3%400==0) || ((y3%100!=0)&&(y3%4==0));
  }
  int getDayNum(int d1,int m1,int y1){
    month[1] = isLeap(y1) ? 29 : 28;
    int n = 0;
    for(int i = 0; i < m1; i++){
      n += month[i];
    }
    n += d1;//add days when month hasn't completed
    return n;
  }
  int diff(int d2,int m2,int y2){
    m2--;
    int daysLeft = -getDayNum(d,m,y);
    for( int x = y; x<y2; x++ ){
      daysLeft += isLeap(x) ? 366 : 365;
    }
    daysLeft += getDayNum(d2,m2,y2);
    return daysLeft;
  }
}

【讨论】:

  • 使用调试器查看出现错误值的位置。我已经修复了程序,但仍然不好。
  • 非常感谢,程序正在运行。另外,现在我在 main 方法的对象创建行中将 m1 替换为 - - m1。同样,在下一行中,m2 已替换为 - - m2。现在无需在任何其他方法中递减 m1 和 m2。
【解决方案2】:
import java.util.Calendar;

public class DateExample {

    public long diff(int d1, int m1, int y1, int d2, int m2, int y2) {

        long days = 0;
        try {
            Calendar calendar1 = Calendar.getInstance();
            calendar1.set(y1, m1, d1);

            Calendar calendar2 = Calendar.getInstance();
            calendar2.set(y2, m2, d2);

            long diff = calendar2.getTimeInMillis()
                    - calendar1.getTimeInMillis();
            days = (diff / (1000 * 60 * 60 * 24));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return days;

    }

    public static void main(String[] args) {
        DateExample dateExample = new DateExample();
        System.out.println(dateExample.diff(20, 3, 1997, 14, 2, 2015));
    }
}

【讨论】:

  • 对不起,我不会使用实用程序包。我必须用非常基础的东西来做。
【解决方案3】:

首先,我不认为 6540 是正确的区别。但是我可以为您提供两个相互一致的解决方案。第一个在java中,第二个在javascript中。对于您的情况,两个程序都输出 6537。

1) JAVA:

int trhFark(String w_trh_1, String w_trh_2) {                               //YYYYMMDD
    int w_fark              = Integer.MAX_VALUE;

    if  ( w_trh_1.length() == 8 && w_trh_2.length() == 8 ) {

          String w_GG       = w_trh_1.substring(6, 8);
          String w_AA       = w_trh_1.substring(4, 6);
          String w_YYYY     = w_trh_1.substring(0, 4);
          Calendar c1       = Calendar.getInstance();
          c1.set(Integer.valueOf(w_YYYY).intValue(), Integer.valueOf(w_AA).intValue(), Integer.valueOf(w_GG).intValue());

                 w_GG       = w_trh_2.substring(6, 8);
                 w_AA       = w_trh_2.substring(4, 6);
                 w_YYYY     = w_trh_2.substring(0, 4);
          Calendar c2       = Calendar.getInstance();
          c2.set(Integer.valueOf(w_YYYY).intValue(), Integer.valueOf(w_AA).intValue(), Integer.valueOf(w_GG).intValue());

          w_fark            = (int) Math.floor( (c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 60 * 60 * 24 ) );
    }

    return w_fark;
}

public Main() {
    System.out.println("20141230" + ", " + "20150102" + " => " + trhFark("20141230", "20150102"));
    System.out.println("19970320" + ", " + "20150214" + " => " + trhFark("19970320", "20150214"));
}

2) JAVASCRIPT:

function trhFark(w_trh_1, w_trh_2) {                                      //YYYYMMDD

var w_fark           =  99999;

if  ( w_trh_1.length == 8 && w_trh_2.length == 8 ) {

      var w_GG       = w_trh_1.substr(6, 2);
      var w_AA       = w_trh_1.substr(4, 2);
      var w_YYYY     = w_trh_1.substr(0, 4);
      var d1         = new Date(); d1.setFullYear(parseInt(w_YYYY, 10), parseInt(w_AA, 10), parseInt(w_GG, 10));

          w_GG       = w_trh_2.substr(6, 2);
          w_AA       = w_trh_2.substr(4, 2);
          w_YYYY     = w_trh_2.substr(0, 4);
      var d2         = new Date(); d2.setFullYear(parseInt(w_YYYY, 10), parseInt(w_AA, 10), parseInt(w_GG, 10));

      w_fark         = Math.floor( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24 ) );
}

alert(w_fark);
}

【讨论】:

  • 6540 是我通过 www.timeanddate.com 上的在线计算器计算得出的答案
  • 是的,你是对的。 6540 是正确的区别。
【解决方案4】:

使用LocalDateTimeLocalDatejava.time 包中的句点。

LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime1 = LocalDateTime.now().plusDays(10);

Period period = Period.between(localDateTime.toLocalDate(), localDateTime1.toLocalDate());
System.out.println(period.getDays());  // 10 

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2017-03-27
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多