2013-11-28 22 views
2

为别人谁可能绊倒在这里,链接refered对这个问题给出了误导性的结果我试图计算两个日期之间的差异,以秒为单位。 (Java/Android设备)

我的第一次约会:1986年4月8日。当前日期:2013-11-28。

代码:

public long seconds(Date date){ 

     String formattedDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",getResources().getConfiguration().locale).format(Calendar.getInstance().getTime()); 

     String DateStr=String.valueOf(formattedDate); 
     Date d = null; 
     try { 
      d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",getResources().getConfiguration().locale).parse(DateStr); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     java.sql.Date dx = new java.sql.Date(d.getTime()); 
     Date d1 = date; 
     Date d2 = dx; 
     t4.setText("BirthDate"+date+"\n Current Date:"+dx); 
     long seconds = (d2.getTime()-d1.getTime())/1000; 
     return seconds; 
    } 

然而,当我在这里检查的结果:http://www.calculator.net/age-calculator.html?today=04%2F04%2F1986&ageat=11%2F28%2F2013&x=32&y=10它给了我一个略有不同的结果。我不确定我出错的地方。

+0

在上面的第二个(日期日期){}实现中,您将在几秒钟内获得差异。当你将秒转换成年龄差异时,你需要考虑1986年到2003年间的闰年。最好的方法是利用Calendar类。 – MAkS

+0

现在我很困惑下面的一个答案说,这个计算更精确,否定夏令时和所有。我现在也很担心闰年.. – Skynet

+0

检查Calender类是否确实提供了其他明智的自己实现的方法。我猜日光节约不应该影响你的结果。 – MAkS

回答

2

我想你是以某种方式混合java.sql.Date和java.util.Date。

我会尝试简化代码。像这样的东西。

public class Test012 { 

    public static void main(String[] args) throws Exception { 
     System.out.println(seconds()); 
     System.out.println(seconds2()); 
     System.out.println(days3()); 
    } 

    public static long seconds() throws Exception { 
     java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); 
     java.util.Date d1 = sdf.parse("1986-04-08"); 
     java.util.Date d2 = sdf.parse("2013-11-28"); 
     return (d2.getTime() - d1.getTime())/1000; 
    } 

    public static long seconds2() throws Exception { 
     java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); 
     java.util.Date d1 = sdf.parse("1986-04-08"); 
     java.util.Date d2 = new java.util.Date(); 
     return (d2.getTime() - d1.getTime())/1000; 
    } 

    public static long days3() throws Exception { 
     java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); 
     java.util.Date d1 = sdf.parse("2008-01-01"); 
     java.util.Date d2 = sdf.parse("2009-01-01"); 
     return (d2.getTime() - d1.getTime())/1000/60/60/24; 
    } 

} 

我也是在SQL Server试图

select datediff(ss, '4/8/1986', '11/28/2013') --- US date format 

和它打印同样的事情,因为这java程序, 它打印872294400.因此,这似乎是正确的值。

你确定你输入的日期是正确的吗 (等于我在测试程序中硬编码的)? 我也会检查一下。

此外,你确定你的日期有零时间零件?这就是您发布的链接/服务所假设的。

+0

是的,确认。但该网站是误导性的。 – Skynet

+0

该网站似乎使用零时间部分,并可能做我在SQL中做的:) –

+0

我需要添加时间部分,但是对于开始日期,我认为它是在午夜。 – Skynet

0

试试这个代码: -

public static long secondsBetween(Calendar startDate, Calendar endDate) { 
    Calendar date = (Calendar) startDate.clone(); 
    long daysBetween = 0; 
    while (date.before(endDate)) { 
     date.add(Calendar.DAY_OF_MONTH, 1); 
     daysBetween++; 
    } 
    return daysBetween*24*3600; 
} 

希望它可以帮助你..享受..!

+0

我想在几秒钟内得出结果。不是在几天内。 – Skynet

+0

哦好吧......伙计 –

+0

好吧现在看到更新的答案 –

4

您链接到的在线服务是错误的:它将整个日期的年龄计算在内,然后假定每天的长度都是24小时。大多数情况下这是正确的,但在世界上大多数地方都有夏令时转换和时区转换的日子,这意味着有23,25天或其他几小时的时间。您从Java代码中获得的数字更精确。

+0

你第一次指出它! – Skynet

相关问题