2013-11-28 60 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

相關問題