Java 无法找到两个日期(时间、秒、月和年)之间的差异?

Java 无法找到两个日期(时间、秒、月和年)之间的差异?,java,simpledateformat,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(

这是我的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天。

您的错误是解析。小写字母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);

Prints:2这是由Java提供的可怕API导致的经典错误:
date.getMonth返回1月为0,2月为1。。。12月11日。如果可以,请尽量避免使用java.util.Date和Calendar:P

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

使用我的欧洲/柏林时区中的日期2014-03-19和2014-04-01作为输入。真正的答案是13天,因为每个人都可以很容易地使用标准日历,但公认的@Duncan代码会产生12天,因为在我的时区中有一个dst跳转,它打破了计算公式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有一种更灵活的方法。

为什么你有那么多奇怪的代码来创建日期,将其拆分并再次解析?duplicate@Duncan实际上我从某个站点复制了该代码。现在我想用它来计算剩余天数。需要问最后一件事,我是否使用s1.parsed1而不是新的SimpleDataFormatdD/mm/yyyy.parsed1;它抛出exception@TruePS调整您的代码以匹配我的示例,您将不会收到异常。如果您不能这样做,请更详细地解释您收到的异常。公共类测试{public static void mainString args[]抛出ParseException{日期d1;字符串s=04-30-2013;SimpleDataFormat ft=new SimpleDataFormatDD/MM/yyyy;d1=ft.parses;System.out.printlnk;System.out.printlnft.formatd1;}}在我收到的代码中exception@TruePS不能期望与dd/MM/yyyy匹配的格式与格式为MM-dd-yyyy的日期匹配。