2011-05-17 72 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