2011-05-17 73 views
0
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class test { 

    /* 
    * Calculate the difference between two date/times * 
    * 
    */ 

    private static long dateDiff(Date toDate, Date fromDate) { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(toDate); 
     long ms = cal.getTimeInMillis(); 
     cal.setTime(fromDate); 
     ms -= cal.getTimeInMillis(); 
     return ms; 
    } 

    public static void main(String[] args) { 

     SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); 
     Date d1 = null; 
     Date d2 = null; 

     try { 
      d1 = sdf.parse("11:00:00"); 
      d2 = sdf.parse("10:00:00"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     long result = dateDiff(d1, d2); 

     Date time = new Date(result); 

     System.out.println(time); 
    } 
} 

當我運行它,我得到這樣的結果:時間問題,此代碼

週四1月1 02:00:00 CET 1970年

我預計1次小時的時差?!再次與時區有關的問題?

任何想法如何解決它。

thx全部

+0

不回答你的問題,但如果你要做大量的工作,日期和時間,你應該使用[喬達時間(HTTP:// joda-time.sourceforge.net/)。它遠遠優於JDK API(以及更友好的IMO)。 – iruediger 2011-05-17 22:38:50

+0

你的計算是正確的 - 這是一個時區問題。在方法中放一個打印語句,直接將毫秒轉換爲另一個單位(例如分鐘)並打印出來。 – 2011-05-17 22:42:11

+0

我需要兩個日期字段之間的時間差異,然後將其放入MySql(時間格式) – 2011-05-17 22:44:28

回答

3

我不知道你希望這樣做,但實際上你正在做的是使用默認時區輸出1970年1月1日午夜後一小時的相應日期。

您似乎想要Date來表示持續時間(即秒數)。它不這樣做,日期格式化程序也不會將日期顯示爲持續時間。


我需要兩個日期字段,然後之間的時間差把它在MySQL(時間格式)

對於你正在嘗試做的,你需要計算時間值一個 long,然後使用 java.sql.Time(long)構造函數創建一個 Time對象。您可以使用其 toString()方法序列化此對象,或者將其用作JDBC準備語句中的參數。

事實證明,我上面的建議也是不正確的。

你真正的問題是,SQL時間類型用於表示時間...不是持續時間。事實上,SQL沒有專用的持續時間類型,所以最好的做法是將持續時間表示爲整數秒或毫秒或其他。


(對於更一般的情況下,約達時間庫通常被認爲操縱日期,時間和相關時間值提供最佳的API,但對於這個簡單的情況下,標準的J2SE庫應該足夠了.. 。只要你正確地使用它們。)

+0

我需要兩個日期字段之間的時間差,然後把它放在MySql(時間格式) – 2011-05-17 22:42:25

+0

我用這樣的事情:Date sessionDate = session.getSessionTime(); \t \t \t long sessionDateInMillis = sessionDate.getTime(); \t \t \t java.sql.Date sqlSessionDate = new java.sql.Date(sessionDateInMillis); – 2011-05-17 22:49:35

2

問題是兩個日期類型的差別不能由其他日期類型表示。

1

你爲什麼不把這兩個日期的毫秒數相減?

Calendar cal = Calendar.getInstance(); 
cal.setTime(d1); 
long d1ms = cal.getTimeInMillis(); 
cal.setTime(d2); 
long d2ms = cal.getTimeInMillis(); 

long diffMs = d1ms - d2ms; 
long diffHour = diffMs * 1000 * 60 * 60; 
+0

我需要兩個Date字段之間的時間差異,然後將其放入MySql(時間格式)中。所以我想從一個日期格式開始到Time(MySql很容易)。通常情況下,差異將是分鐘 – 2011-05-17 22:46:56

+0

時間差異不能用MySQL TIME格式表示。 「60分鐘」不是有效的日期。 – Alp 2011-05-18 08:32:49

0

嗨試試這個設置時區爲GMT。在合成的時間差中刪除日,月的文字。這個方法沒有做任何事情,只是假設自從1970年1月1日開始在java中使用時間計數器以來這些毫秒。所以如果你的結果說1970年1月3日意味着從計時器開始以來已經過去了3天,這是完美的。你只需要正確地解釋它,但是格式化你的答案

... 
long result = dateDiff(d1, d2); //This is your code in main([]) 
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss SSS"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println(dateFormat.format(new Date(result))); 
+0

呃......你是否讀過OP的評論,他解釋了他真正想要做的事情? – 2011-05-18 05:52:09

+0

日期是數據庫中最刺激的東西,所以這是問題:)。但是由於你不應該在特定的數據庫中存儲日期的方式,比如1970年1月1日以後的毫秒或者某些標準格式的數據時間字符串。訣竅是將其正確地閱讀並將時區設置爲GMT並讀取值。如果持續時間較短,則不需要任何時間API,僅在日期差異超過一個月的情況下使用'diffMs * 1000 * 60 * 60'或某些模數運算,才能計算一些棘手的日期計算,使用日期API然後。 – 2011-05-19 04:16:31

+0

持續時間和日期在概念上是不同的。他的問題是,他正在嘗試格式化並將時間存儲爲日期/時間值。這已破了。 – 2011-05-19 05:53:40