【问题标题】:I am trying to calculate difference between two dates in seconds. (Java/Android)我试图以秒为单位计算两个日期之间的差异。 (Java/安卓)
【发布时间】:2013-11-28 11:14:43
【问题描述】:

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

我的第一次约会: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 它给了我一个稍微不同的结果。我不确定我哪里出错了。

【问题讨论】:

  • 在第二个(日期日期){} 实施中,您会以秒为单位获得差异。当您将秒数转换为年龄差异时,您需要考虑 1986 年到 2003 年之间的闰年。最好的方法是使用 Calendar 类。
  • 现在我很困惑下面的一个答案说这个计算更精确,否定了夏令时等等。我现在也担心闰年..
  • 检查 Calender 类是否确实提供了这样的方法,而不是您自己的实现。我想夏令时不会影响你的结果。

标签: java android android-date


【解决方案1】:

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

【讨论】:

    【解决方案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。所以这似乎是正确的值。

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

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

    【讨论】:

    • 是的,已确认。但是该网站具有误导性。
    • 该网站似乎使用了零时间部分,并且可能做了我在 SQL 中所做的事情 :)
    • 我需要添加时间部分,但是对于开始日期,我假设它是在午夜。
    • 我明白了。然后查看更新的测试程序。我的意思是,我不确定实际的问题是什么。正确解析结束日期后,您就不会再遇到任何问题了。
    • 是的,当然 :) 否则就大错特错了。让我再次更新我的程序。 2008年是飞跃。查看 days3 打印出来的内容 - 366 天,这是由于 2008 年 2 月 29 日的存在。
    【解决方案3】:

    试试这个代码:--

     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;
    }
    

    希望它对您有所帮助.. 享受..!

    【讨论】:

    • 我想要几秒钟内的结果。不是几天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2013-08-20
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多