我试图计算两个日期之间的差异,以秒为单位。 (爪哇/ Android装置)

时间:2013-11-28 11:14:44

标签: java android android-date

对于可能在此绊倒的其他人,此问题中提到的链接会产生误导性结果

我的第一次约会:1986-04-08。当前日期: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它给了我一个略微不同的结果。我不确定我哪里出错了。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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;
    }

}

我也试过

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

在SQL Server中它打印与此java程序相同的东西, 它打印872294400.所以这似乎是正确的值。

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

另外,您确定您的日期零时间部分吗?这就是您发布的链接/服务所假设的内容。

答案 2 :(得分: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;
}

希望它能帮助你......享受......!