无法在w.r.t时间,秒,月和年之间找到两个日期之间的差异?

时间:2014-04-08 07:23:36

标签: java simpledateformat

这是我的java类

   public class dateparse {
   public static void main(String args[]) throws ParseException
   {
   Date dd=new Date();
   int year = Calendar.getInstance().get(Calendar.YEAR);
    int month=0;
   int calc_days=0;
   String d1 = dd.getDate()+"/"+dd.getMonth()+"/"+year;
   String d2 = "19/1/2014";
   SimpleDateFormat s1 = new SimpleDateFormat("dd/mm/yyyy");
   SimpleDateFormat s2 = new SimpleDateFormat("dd/mm/yyyy");
   Date dateOne = new SimpleDateFormat("dd/mm/yyyy").parse(d1);
   Date dateTwo = s2.parse(d2);
   long diff = dateOne.getTime() - dateTwo.getTime();
   calc_days=    (int) (diff / 1000 / 60 / 60 / 24 / 1);
    }
   }

我正在尝试找出当前日期与指定的日期之间的差异,关于秒,分钟,小时,天,月和年。我的输入日期是2014年2月19日。我想显示不同的天(例如10天)或月数+天(例如1个月和2天)或年+月+天(例如1年2个月和4天)。但是当我运行此代码时,它返回差异为-10天。

3 个答案:

答案 0 :(得分:3)

您的错误是您的解析。小写m表示分钟,而不是月份:

SimpleDateFormat s2 = new SimpleDateFormat("dd/mm/yyyy");

应该是:

SimpleDateFormat s2 = new SimpleDateFormat("dd/MM/yyyy");

这是一个简单的例子:

String d1 = "21/1/2014";
String d2 = "19/1/2014";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date dateOne = sdf.parse(d1);
Date dateTwo = sdf.parse(d2);
long diff = dateOne.getTime() - dateTwo.getTime();
int differenceInDays = (int) (diff / 1000 / 60 / 60 / 24 / 1);
System.out.println(differenceInDays);

打印:2

答案 1 :(得分:2)

这是由Java提供的可怕API引起的经典错误: date.getMonth()在1月份返回0,在2月份返回1,在12月份返回11。如果可以,请尝试避免使用java.util.Date和Calendar:P

答案 2 :(得分:1)

注意 - 接受的答案是错误的!证明:

在我的时区"欧洲/柏林"中使用日期2014-03-19和2014-04-01 作为输入。 真正的答案是13天,因为每个人都可以轻松使用标准日历,但是@Duncan接受的代码会产生 12天,因为在我的时区有一个dst-jump打破计算公式的基础(1天= 24小时)。 3月30日那天只有23个小时。

JDK pre 8没有为此问题提供内置的通用解决方案。另请注意,您的输入只是一对两个简单的日期,没有时间。因此,在几秒钟内询问差异是愚蠢的。仅仅要求天,月,周或年的差异是明智的。在Java 8中,您可以执行以下操作:

// only days
LocalDate start = LocalDate.of(2014, 3, 19); // start in March
LocalDate end = LocalDate.of(2014, 4, 1);
int days = ChronoUnit.DAYS.between(start, end); // 13

// period in years, months and days
LocalDate start = LocalDate.of(2014, 2, 19); // start in February
LocalDate end = LocalDate.of(2014, 4, 1);
Period period = Period.between(start, end); // P1M13D = 1 month + 13 days

很遗憾,您无法自由选择喜欢的日历单位来表达差异。 JodaTime(和我的库)使用PeriodType进行了更灵活的方法。